103 votes

Quel est l'équivalent en C# de NaN ou IsNumeric ?

Quel est le moyen le plus efficace de tester une chaîne d'entrée pour savoir si elle contient une valeur numérique (ou inversement Not A Number) ? Je suppose que je peux utiliser Double.Parse ou une expression rationnelle (voir ci-dessous), mais je me demandais s'il n'existait pas un moyen intégré de le faire, tel que la fonction javascript NaN() o IsNumeric() (était-ce du VB, je ne me souviens plus ?).

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

1 votes

177voto

Chris Lively Points 59564

Il n'y a pas de surcharge pour les 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
}

Par ailleurs, tous les types de données standard, à l'exception flagrante des GUID, supportent TryParse.

mise à jour
secretwep a fait remarquer que la valeur "2345," passera le test ci-dessus en tant que nombre. Toutefois, si vous devez vous assurer que tous les caractères de la chaîne sont des chiffres, il faut adopter une autre approche.

exemple 1 :

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

  return value;
}

ou si vous voulez être un peu plus fantaisiste

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

actualisation 2 ( de @stackonfire pour traiter les chaînes de caractères nulles ou vides)

public Boolean IsNumber(String s) { 
    Boolean value = true; 
    if (s == String.Empty || s == null) { 
        value=false; 
    } else { 
        foreach(Char c in s.ToCharArray()) { 
            value = value && Char.IsDigit(c); 
        } 
    } return value; 
}

0 votes

Si nécessaire, vous pouvez transformer le code ci-dessus en une méthode utilitaire plus utile telle que public static bool IsInteger(string sMaybeANumber)

0 votes

@Gishu : Vous avez raison si tout ce qui vous importe est de savoir si le nombre peut être converti.

2 votes

Le seul problème avec ceci est le Number en Javascript est un float ou un integer, donc changer pour double.TryParse serait un équivalent plus exact.

40voto

Anthony Mastrean Points 8582

Je préfère quelque chose comme ça, ça vous laisse décider de ce que NumberStyle à tester.

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

7 votes

+1 pour être la seule personne jusqu'à présent à utiliser Double.TryParse au lieu de Int.TryParse :)

0 votes

C'est aussi, évidemment, presque une méthode d'extension.

20voto

Stu Mackellar Points 8605

En plus des réponses correctes précédentes, il est probablement utile de souligner que "Not a Number" (NaN) dans son usage général est no équivalent à une chaîne de caractères qui ne peut pas être évaluée comme une valeur numérique. NaN est généralement compris comme une valeur numérique utilisée pour représenter le résultat d'un calcul "impossible" - où le résultat est indéfini. À cet égard, je dirais que l'usage Javascript est légèrement trompeur. En C#, NaN est défini comme une propriété des types numériques simples et doubles et est utilisé pour se référer explicitement au résultat de la plongée de zéro par zéro. D'autres langages l'utilisent pour représenter différentes valeurs "impossibles".

4voto

shahkalpesh Points 21553

VB a le IsNumeric fonction. Vous pouvez faire référence à Microsoft.VisualBasic.dll et l'utiliser.

0 votes

Cette méthode VB n'est disponible que dans les versions > 2.0 de .net ?

0 votes

@ChuckD : C'est subjectif. Faites-vous référence à des bibliothèques externes qui traitent le json ou écrivez-vous tout pour analyser le json vous-même ?

0 votes

@ChuckD : Epargnez-moi le radotage et expliquez-moi pourquoi c'est de la merde. Pour moi, c'est juste une autre dll qui contient quelques classes/fonctions utiles.

3voto

kenny Points 9150

Il s'agit peut-être d'une fonctionnalité de C# 3, mais vous pourriez utiliser double.NaN .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X