Si j'ai ces cordes :
-
"abc"
=false
-
"123"
=true
-
"ab2"
=false
Existe-t-il une commande, comme IsNumeric()
ou quelque chose d'autre, qui puisse identifier si une chaîne de caractères est un nombre valide ?
Si j'ai ces cordes :
"abc"
= false
"123"
= true
"ab2"
= false
Existe-t-il une commande, comme IsNumeric()
ou quelque chose d'autre, qui puisse identifier si une chaîne de caractères est un nombre valide ?
int n;
bool isNumeric = int.TryParse("123", out n);
Mise à jour À partir de C# 7 :
var isNumeric = int.TryParse("123", out int n);
ou si vous n'avez pas besoin du numéro, vous pouvez écarter le paramètre de sortie
var isNumeric = int.TryParse("123", out _);
Les var peuvent être remplacés par leurs types respectifs !
Cependant, j'utiliserais double.TryParse, puisque nous voulons savoir s'il représente un nombre.
La fonction retournera vrai si je passe la chaîne comme "-123" ou "+123". Je comprends que les entiers ont des valeurs positives et négatives. Mais si cette chaîne provient d'une zone de texte saisie par l'utilisateur, elle devrait renvoyer false.
C'est une bonne solution, jusqu'à ce qu'un utilisateur entre une valeur comprise entre -2 147 483 648 et 2 147 483 647, et que la procédure échoue silencieusement.
Le résultat sera vrai si input
est constitué de tous les nombres. Je ne sais pas si c'est mieux que TryParse
mais cela fonctionnera.
Regex.IsMatch(input, @"^\d+$")
Si vous voulez simplement savoir s'il y a un ou plusieurs nombres mélangés à des caractères, ne tenez pas compte de l'option ^
+
y $
.
Regex.IsMatch(input, @"\d")
Edita: En fait, je pense que c'est mieux que TryParse parce qu'une chaîne très longue pourrait potentiellement déborder TryParse.
@CFP +1...Les RegEx sont toujours mieux que les fonctions habituelles, quand elles sont applicables !
@MAXE : Je ne suis pas d'accord. Les vérifications d'expressions régulières sont assez lentes, il y a donc souvent de meilleures solutions si la performance est prise en compte.
J'ai utilisé cette fonction à plusieurs reprises :
public static bool IsNumeric(object Expression)
{
double retNum;
bool isNum = Double.TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInfo, out retNum);
return isNum;
}
Mais vous pouvez aussi utiliser ;
bool b1 = Microsoft.VisualBasic.Information.IsNumeric("1"); //true
bool b2 = Microsoft.VisualBasic.Information.IsNumeric("1aa"); // false
De Analyse comparative des options IsNumeric
(source : <a href="http://aspalliance.com/images/articleimages/80/Figure1.gif" rel="noreferrer">aspalliance.com </a>)
(source : <a href="http://aspalliance.com/images/articleimages/80/Figure2.gif" rel="noreferrer">aspalliance.com </a>)
Je n'ai aucun problème à utiliser "IsNumeric", cela fonctionne bien. Vous pouvez également constater qu'il y a peu de différence d'efficacité entre TryParse et IsNumeric. N'oubliez pas que TryParse est une nouveauté de la version 2.0 et qu'avant, il était préférable d'utiliser IsNumeric plutôt qu'une autre stratégie.
Eh bien, IsNumeric() de VB.NET utilise en interne double.TryParse(), après un certain nombre de girations nécessaires (entre autres) pour la compatibilité avec VB6. Si vous n'avez pas besoin de compatibilité, double.TryParse() est tout aussi simple à utiliser et vous évite de gaspiller de la mémoire en chargeant Microsoft.VisualBasic.dll dans votre processus.
C'est probablement la meilleure option en C#.
Si vous voulez savoir si la chaîne contient un nombre entier (integer) :
string someString;
// ...
int myInt;
bool isNumerical = int.TryParse(someString, out myInt);
La méthode TryParse tente de convertir la chaîne de caractères en un nombre (entier). Si elle y parvient, elle renvoie true et place le nombre correspondant dans myInt. Si elle n'y parvient pas, elle renvoie false.
Solutions à l'aide de l'outil int.Parse(someString)
présentée dans d'autres réponses fonctionne, mais elle est beaucoup plus lente car le lancement d'exceptions est très coûteux. TryParse(...)
a été ajouté au langage C# dans la version 2, et jusqu'alors, vous n'aviez pas le choix. Désormais, vous avez le choix : vous devez donc éviter l'utilisation de l'option Parse()
alternative.
Si vous souhaitez accepter des nombres décimaux, la classe décimale dispose également d'une fonction .TryParse(...)
méthode. Remplacez int par decimal dans la discussion ci-dessus, et les mêmes principes s'appliquent.
Vous pouvez toujours utiliser les méthodes TryParse intégrées pour de nombreux types de données afin de vérifier si la chaîne en question est acceptée.
Exemple.
decimal myDec;
var Result = decimal.TryParse("123", out myDec);
Le résultat serait alors = True
decimal myDec;
var Result = decimal.TryParse("abc", out myDec);
Le résultat serait alors = Faux
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.
80 votes
Dans leurs exemples, vous pouvez voir qu'ils voulaient dire que si le chaîne entière représente un nombre.
54 votes
Return str.All(Char.IsDigit) ;
14 votes
Str.All(Char.IsDigit) déclarera "3.14" faux ainsi que "-2" et "3E14". Sans parler de "0x10"
4 votes
Cela dépend du type de nombre que vous essayez de vérifier. Pour les nombres entiers sans séparateur (c'est-à-dire les chaînes de chiffres décimaux), cette vérification fonctionne, et c'est la même chose que la réponse acceptée et celle sous-entendue dans l'OP.
0 votes
@AustinSalonen, je ne comprends pas votre point de vue. #Le n°3 a des lettres (et un seul chiffre) donc il devrait être faux. Si l'utilisateur saisit "ab2", l'hypothèse est qu'il ne comprend pas et nous ne pouvons donc pas supposer que nous comprenons ce qu'il veut dire.
0 votes
Oh là là... J'ai parcouru brièvement les réponses et je me demande si je ne devrais pas poster une réponse supplémentaire avec
TryParse
. Qu'en pensez-vous ? :D Ok, laissez tomber.1 votes
@Lucas merci pour votre commentaire, vous n'avez PAS idée du temps que j'ai passé à essayer d'analyser une chaîne double en tant qu'int et à me demander pourquoi cela échouait...
1 votes
Et ma recherche de "un", "deux", etc. continue...