Qual é o equivalente em C # de NaN ou IsNumeric?

Qual é a maneira mais eficiente de testar uma string de input se ela contém um valor numérico (ou inversamente, não é um número)? Eu acho que eu posso usar Double.Parse ou um regex (veja abaixo), mas eu queria saber se há algum construído em maneira de fazer isso, como NaN() ou IsNumeric() do javascript (foi que VB, não me lembro ?)

 public static bool IsNumeric(this string value) { return Regex.IsMatch(value, "^\\d+$"); } 

Isso não tem a sobrecarga de regex

 double myNum = 0; String testVar = "Not A Number"; if (Double.TryParse(testVar, out myNum)) { // it is a number } else { // it is not a number } 

Incidentalmente, todos os tipos de dados padrão, com a excepcional exceção de GUIDs, suportam TryParse.

atualizar
O secretSet levantou que o valor “2345” passará no teste acima como um número. No entanto, se você precisar garantir que todos os caracteres da string sejam dígitos, outra abordagem deve ser tomada.

exemplo 1 :

 public Boolean IsNumber(String s) { Boolean value = true; foreach(Char c in s.ToCharArray()) { value = value && Char.IsDigit(c); } return value; } 

ou se você quiser ser um pouco mais chique

 public Boolean IsNumber(String value) { return value.All(Char.IsDigit); } 

Eu prefiro algo assim, ele permite que você decida o que o NumberStyle deve testar.

 public static Boolean IsNumeric(String input, NumberStyles numberStyle) { Double temp; Boolean result = Double.TryParse(input, numberStyle, CultureInfo.CurrentCulture, out temp); return result; } 

Além das respostas corretas anteriores, provavelmente vale a pena ressaltar que “Não um Número” (NaN) em seu uso geral não é equivalente a uma string que não pode ser avaliada como um valor numérico. NaN é normalmente entendido como um valor numérico usado para representar o resultado de um cálculo “impossível” – onde o resultado é indefinido. A esse respeito, eu diria que o uso do Javascript é um pouco enganador. Em C # NaN é definido como uma propriedade dos tipos numérico simples e duplo e é usado para referenciar explicitamente o resultado do mergulho zero por zero. Outras linguagens usam-no para representar diferentes valores “impossíveis”.

Sim, IsNumeric é VB. Geralmente as pessoas usam o método TryParse (), embora seja um pouco desajeitado. Como você sugeriu, você sempre pode escrever o seu próprio.

 int i; if (int.TryParse(string, out i)) { } 

Eu gosto do método de extensão, mas não gosto de lançar exceções, se possível. Optei por um método de extensão com as duas melhores respostas aqui.

  ///  /// Extension method that works out if a string is numeric or not ///  /// string that may be a number /// true if numeric, false if not public static bool IsNumeric(this String str) { double myNum = 0; if (Double.TryParse(str, out myNum)) { return true; } return false; } 

Eu sei que isso foi respondido de muitas maneiras diferentes, com extensões e exemplos de lambda, mas uma combinação de ambos para a solução mais simples.

 public static bool IsNumeric(this String s) { return s.All(Char.IsDigit); } 

ou se você estiver usando o Visual Studio 2015 (C # 6.0 ou superior), em seguida,

 public static bool IsNumeric(this String s) => s.All(Char.IsDigit); 

Impressionante C # 6 em uma linha. Claro que isso é limitado porque apenas testa apenas caracteres numéricos.

Para usar, basta ter uma string e chamar o método, como:

 bool IsaNumber = "123456".IsNumeric(); 

Você ainda pode usar a function do Visual Basic em C #. A única coisa que você precisa fazer é seguir minhas instruções abaixo:

  1. Adicione a referência à Biblioteca do Visual Basic clicando com o botão direito do mouse em seu projeto e selecionando “Add Reference”:

insira a descrição da imagem aqui

  1. Em seguida, importe -o na sua turma, conforme mostrado abaixo:

    usando Microsoft.VisualBasic;

  2. Em seguida, use-o onde quiser, conforme mostrado abaixo:

      if (!Information.IsNumeric(softwareVersion)) { throw new DataException(string.Format("[{0}] is an invalid App Version! Only numeric values are supported at this time.", softwareVersion)); } 

Espero que isso ajude e boa sorte!

VB tem a function IsNumeric . Você poderia fazer referência Microsoft.VisualBasic.dll e usá-lo.

Extensão simples:

 public static bool IsNumeric(this String str) { try { Double.Parse(str.ToString()); return true; } catch { } return false; } 
 public static bool IsNumeric(string anyString) { if (anyString == null) { anyString = ""; } if (anyString.Length > 0) { double dummyOut = new double(); System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo("en-US", true); return Double.TryParse(anyString, System.Globalization.NumberStyles.Any, cultureInfo.NumberFormat, out dummyOut); } else { return false; } } 

Talvez este seja um recurso C # 3, mas você poderia usar double.NaN .

Na verdade, o Double.NaN é suportado em todas as versões .NET 2.0 e superiores.

Eu estava usando o trecho de Chris Lively (resposta selecionada) encapsulado em uma function de bool como a sugestão de Gishu por um ano ou dois. Usei-o para garantir que determinadas strings de consulta fossem apenas numéricas antes de prosseguir com o processamento adicional. Comecei a receber alguns querystrings errôneos que a resposta marcada não estava manipulando, especificamente, sempre que uma vírgula foi passada depois de um número como “3645” (retornou verdadeiro). Este é o mod resultante:

  static public bool IsNumeric(string s) { double myNum = 0; if (Double.TryParse(s, out myNum)) { if (s.Contains(",")) return false; return true; } else { return false; } } 

Eu tenho uma versão ligeiramente diferente, que retorna o número. Eu diria que na maioria dos casos, após testar a string, você usaria o número.

 public bool IsNumeric(string numericString, out Double numericValue) { if (Double.TryParse(numericString, out numericValue)) return true; else return false; }