web-dev-qa-db-fra.com

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

Quel est le moyen le plus efficace de tester une chaîne d'entrée, qu'elle contienne une valeur numérique (ou inversement, pas un nombre)? Je suppose que je peux utiliser Double.Parse ou une expression régulière (voir ci-dessous), mais je me demandais s’il existe une méthode intégrée pour le faire, telle que NaN() ou IsNumeric() de javascript (était-ce VB, je ne me souviens plus?).

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

Cela n'a pas la surcharge 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
}

Incidemment, tous les types de données standard, à l'exception flagrante des GUID, prennent en charge TryParse.

mettre à jour
secretwep a indiqué que la valeur "2345" passerait le test ci-dessus sous forme de nombre. Toutefois, si vous devez vous assurer que tous les caractères de la chaîne sont des chiffres, vous devez 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 chic

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

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;
}
40
Anthony Mastrean

En plus des réponses correctes précédentes, il convient probablement de souligner que "Pas un nombre" (NaN) dans son utilisation générale est pas équivalent à une chaîne 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'utilisation de Javascript est légèrement trompeuse. En C #, NaN est défini comme une propriété des types simple et double numérique et est utilisé pour faire explicitement référence au résultat de la plongée zéro par zéro. D'autres langues l'utilisent pour représenter différentes valeurs "impossibles".

19
Stu Mackellar

Je sais que cela a été répondu de nombreuses manières différentes, avec des extensions et des exemples lambda, mais une combinaison des deux pour la solution la plus simple.

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

ou si vous utilisez Visual Studio 2015 (C # 6.0 ou supérieur), alors

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

Super C # 6 sur une ligne. Bien sûr, ceci est limité car il ne teste que les caractères numériques. 

Pour l'utiliser, il suffit d'avoir une chaîne et d'appeler la méthode dessus, telle que:

bool IsaNumber = "123456".IsNumeric();
6
Paul Bartlett

Ouais, IsNumeric est VB. Habituellement, les gens utilisent la méthode TryParse (), bien qu’elle soit un peu maladroite. Comme vous l'avez suggéré, vous pouvez toujours écrire le vôtre. 

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

}
5
Ed S.

J'aime la méthode d’extension, mais n’aime pas lancer d’exceptions si possible ..__ j’ai opté pour une méthode d’extension prenant le meilleur des 2 réponses ici.

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

Vous pouvez toujours utiliser la fonction Visual Basic en C #. La seule chose à faire est de suivre les instructions ci-dessous:

  1. Ajoutez la référence à la bibliothèque Visual Basic en cliquant avec le bouton droit de la souris sur votre projet et en sélectionnant "Ajouter une référence":

enter image description here

  1. Puis import dans votre classe, comme indiqué ci-dessous:

    using Microsoft.VisualBasic;

  2. Suivant utilisez-le où vous voulez comme indiqué ci-dessous:

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

J'espère que ça t'aide et bonne chance!

4
Vincy

Extension simple:

public static bool IsNumeric(this String str)
{
    try
    {
        Double.Parse(str.ToString());
        return true;
    }
    catch {
    }
    return false;
}
4
MrSiir

VB a la fonction IsNumeric. Vous pouvez référencer Microsoft.VisualBasic.dll et l'utiliser.

4
shahkalpesh
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;
    }
}
3
Mnaouar

C’est peut-être une fonctionnalité C # 3, mais vous pouvez utiliser double.NaN.

3
kenny

J'utilisais l'extrait de Chris Lively (réponse choisie) encapsulé dans une fonction booléenne telle que la suggestion de Gishu pendant un an ou deux. Je l'ai utilisé pour m'assurer que certaines chaînes de requête n'étaient que numériques avant de poursuivre le traitement. J'ai commencé à recevoir des chaînes de requête erronées que la réponse marquée ne gérait pas, en particulier chaque fois qu'une virgule est passée après un nombre tel que "3645" (retourné vrai). Voici le mod résultant:

   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;
      }
   }
2
secretwep

En fait, Double.NaN est pris en charge dans toutes les versions .NET 2.0 et supérieures.

2
Madcat

J'ai une version légèrement différente qui renvoie le nombre. Je suppose que dans la plupart des cas, après avoir testé la chaîne, vous voudriez utiliser le nombre.

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