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+$");
}
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);
}
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;
}
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".
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();
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))
{
}
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;
}
Vous pouvez toujours utiliser la fonction Visual Basic en C #. La seule chose à faire est de suivre les instructions ci-dessous:
Puis import dans votre classe, comme indiqué ci-dessous:
using Microsoft.VisualBasic;
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!
Extension simple:
public static bool IsNumeric(this String str)
{
try
{
Double.Parse(str.ToString());
return true;
}
catch {
}
return false;
}
VB a la fonction IsNumeric
. Vous pouvez référencer Microsoft.VisualBasic.dll
et l'utiliser.
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;
}
}
C’est peut-être une fonctionnalité C # 3, mais vous pouvez utiliser double.NaN
.
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;
}
}
En fait, Double.NaN
est pris en charge dans toutes les versions .NET 2.0 et supérieures.
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;
}