Identifier si une chaîne est un nombre
Si j'ai ces chaînes:
-
"abc"
=false
-
"123"
=true
-
"ab2"
=false
Est-il une commande, comme IsNumeric()
ou quelque chose d'autre, qui peut déterminer si une chaîne est un nombre valide?
- à partir de ces exemples, vous pouvez voir qu'il voulait dire que si l'ensemble de la chaîne représente un nombre.
- retour str.Tous(Char.Appel isdigit);
- str.Tous(Char.Appel isdigit) déclare "3.14" faux ainsi que "-2" et "3E14". Pour ne pas parler de: "0x10"
- Cela dépend de quel type de numéro que vous essayez de vérifier. Pour des nombres entiers sans séparateur (c'est à dire les chaînes de chiffres après la virgule) cette case œuvres, et c'est la même de la accepté de répondre et de la un implicite dans l'OP.
- Je ne comprends pas votre point de vue. #3 lettres (et un seul nombre), donc ça devrait être faux. Si l'utilisateur entre "ab2", alors l'hypothèse est qu'ils ne comprennent pas et donc nous ne pouvons pas supposer que nous comprenons ce qu'ils entendent.
- Oh mon dieu... je suis allé brièvement à travers les réponses et je me demandais si je devrais poster une réponse de plus avec
TryParse
. Qu'en pensez-vous? 😀 Ok, oubliez ça. - merci pour votre commentaire, vous n'avez AUCUNE idée de combien de temps j'ai essayé d'analyser une chaîne double comme un int et je me demandais pourquoi il n'était pas...
- aaand ma recherche pour "un", "deux", etc j'en passe...
Vous devez vous connecter pour publier un commentaire.
Mise à jour de C# 7:
La var s peuvent être remplacés par leurs types respectifs!
public static bool IsNumeric(this string text) { double _out; return double.TryParse(text, out _out); }
NaN
n'est pas un nombre ou même un concept en C#,Cela renvoie true si
input
est tous les nombres. Ne sais pas si c'est mieux queTryParse
, mais il faudra travailler.Si vous voulez simplement savoir si elle a un ou plusieurs numéros mélangé avec les personnages, de laisser sur le
^
+
et$
.Edit:
En fait, je pense que c'est mieux que TryParse en raison d'une très longue chaîne pourrait potentiellement débordement TryParse.
Regex
ce moment sur mon propre, je vous remercie.RegexOptions.Compiled
en tant que paramètre si vous êtes en cours d'exécution, des milliers de ces pour une possible augmentation de la vitesse deRegex.IsMatch(x.BinNumber, @"\d", RegexOptions.Compiled)
RegexOptions.Compiled
en tant que paramètre si vous êtes en cours d'exécution, des milliers de ces pour une possible augmentation de la vitesse deRegex.IsMatch(x.BinNumber, @"^\d+$", RegexOptions.Compiled)
.
Vous pouvez également utiliser:
Il sera de retour
true
pour tous les Chiffres (pasfloat
) etfalse
si la chaîne d'entrée est toute sorte de alphanumériques.Veuillez noter:
stringTest
ne doit pas être une chaîne vide, ce qui permettrait de passer le test de l'être numérique...--..--
comme un nombre valide. Clairement pas.J'ai utilisé cette fonction plusieurs fois:
Mais vous pouvez également utiliser;
De L'Analyse Comparative IsNumeric Options
(source: aspalliance.com)
(source: aspalliance.com)
C'est probablement la meilleure option en C#.
Si vous voulez savoir si la chaîne contient un nombre entier (integer):
La méthode TryParse va essayer de convertir la chaîne en nombre (entier) et si elle réussit, elle sera de retour véritable lieu et le numéro correspondant dans myInt. Si il ne peut pas, elle retourne false.
Solutions à l'aide de la
int.Parse(someString)
alternative à d'autres réponses œuvres, mais il est beaucoup plus lent en raison de lever des exceptions est très cher.TryParse(...)
a été ajouté le langage C# dans la version 2, et jusqu'alors, vous n'avez pas le choix. Maintenant vous le savez: il faut donc éviter de leParse()
alternative.Si vous souhaitez accepter les nombres décimaux, les décimales classe possède également une
.TryParse(...)
méthode. Remplacer int avec décimale dans la discussion ci-dessus, et les mêmes principes s'appliquent.Vous pouvez toujours utiliser le construit en TryParse méthodes pour de nombreux types de données pour voir si la chaîne en question va passer.
Exemple.
Résultat serait alors = True
Résultat serait alors = False
Dans le cas où vous ne souhaitez pas utiliser int.Analyser ou double.Analyser, vous pouvez rouler votre propre avec quelque chose comme ceci:
char
, ou vous aurez unMember 'char.IsDigit(char)' cannot be accessed with an instance reference; qualify it with a type name instead
erreur:.All(c => char.IsDigit(c) || c == '.'))
Et @RusselYang - Toute logique est erronée; la question est de savoir lequel des bugs que vous n'avez pas l'esprit d'expédition. ;^) Mais je reçois votre point de vue.Je sais que c'est un vieux thread, mais aucune des réponses vraiment fait pour moi - soit inefficace, ou non encapsulé pour les réutiliser facilement. Je voulais aussi s'assurer qu'il est retourné false si la chaîne est vide ou null. TryParse renvoie true dans ce cas (une chaîne vide ne provoque pas d'erreur lors de l'analyse d'un nombre). Donc, voici ma chaîne de la méthode d'extension:
Simple à utiliser:
Ou, si vous voulez tester d'autres types de numéro, vous pouvez préciser le "style".
Donc, pour convertir un nombre avec un Exposant, vous pouvez utiliser:
Ou pour tester un potentiel de chaîne Hexadécimale, vous pouvez utiliser:
L'option "culture" paramètre peut être utilisé dans beaucoup de la même manière.
Elle est limitée par ne pas être en mesure de convertir des chaînes de caractères qui sont trop grande pour être contenue dans un double, mais qui est une exigence et je pense que si vous travaillez avec des nombres plus grands que cela, alors vous aurez probablement besoin de plus spécialisées nombre des fonctions de gestion, de toute façon.
Si vous voulez attraper un plus large éventail de numéros, à la de PHP is_numeric, vous pouvez utiliser les éléments suivants:
De Test De L'Unité:
Garder à l'esprit que juste parce que une valeur numérique ne signifie pas qu'il peut être converti en un type numérique. Par exemple,
"999999999999999999999999999999.9999999999"
est un perfeclty valeur numérique valide, mais il ne rentre pas dans une .NET numérique de type (pas celle qui est définie dans la bibliothèque standard, qui est).0[0-7]*
(avec l'étoile)? Qui doit correspondre à un seul 0. Le "dec" modèle a été ajusté de sorte qu'il corresponde à un ou plusieurs 0 si elles sont suivies par un point décimal.Vous pouvez utiliser TryParse afin de déterminer si la chaîne peut être analysée en un entier.
Le booléen est vous dire si cela a fonctionné ou pas.
Si vous voulez vérifier si une chaîne est un nombre (je suppose que c'est une chaîne, car si c'est un nombre, euh, vous savez, c'est une).
vous pouvez aussi faire:
Cela va prendre soin de l'habituel méchants:
contient le caractère décimalBigIntegers de ne pas analyser des nombres avec décimales. (Donc:BigInteger.Parse("3.3")
va lever une exception, etTryParse
pour la même renvoie false)Double.TryParse
Vous devez ajouter une référence à
System.Numerics
et ont
sur le dessus de votre classe (eh bien, le second est un bonus, je suppose 🙂using System.Numerics;
Je suppose que cette réponse aura juste perdu entre tous les autres, mais de toute façon, va ici.
J'ai fini sur cette question via Google parce que je voulais vérifier si une
string
étaitnumeric
de sorte que je pouvaisdouble.Parse("123")
au lieu de laTryParse()
méthode.Pourquoi? Parce que c'est ennuyeux d'avoir à déclarer une
out
variable et de vérifier le résultat deTryParse()
avant de savoir si l'analyse a échoué ou non. Je veux utiliser leternary operator
pour vérifier si lastring
estnumerical
et puis il suffit de l'analyser dans le premier ternaire de l'expression ou de fournir une valeur par défaut dans la deuxième ternaire expression.Comme ceci:
C'est juste beaucoup plus propre que:
J'ai fait une couple
extension methods
pour ces cas:Extension de la méthode
Exemple:
Parce que
IsParseableAs()
tente d'analyser la chaîne comme le type approprié au lieu de simplement vérifier si la chaîne est "numérique", il devrait être assez fort. Et vous pouvez même les utiliser à des fins non numérique des types qui ont unTryParse()
méthode, commeDateTime
.La méthode utilise la réflexion et vous vous retrouvez l'appel de la
TryParse()
méthode deux fois, ce qui, bien sûr, n'est pas aussi efficace, mais tout n'a pas à être entièrement optimisée, parfois, la commodité est un peu plus important.Cette méthode peut également être utilisé pour analyser facilement une liste de chaînes numériques dans une liste de
double
ou d'un autre type avec une valeur par défaut sans avoir à attraper toutes les exceptions:Méthode d'Extension de deux
Cette méthode d'extension vous permet d'analyser une
string
que touttype
qui a unTryParse()
méthode et il vous permet également de spécifier une valeur par défaut pour le retour si la conversion échoue.C'est mieux que d'utiliser l'opérateur ternaire avec l'extension de la méthode ci-dessus, car il ne la conversion en une fois. Il utilise toujours la réflexion que...
Exemples:
Sorties:
var x = double.TryParse("2.2", new double()) ? double.Parse("2.2") : 0.0;
?Argument 2 must be passed with the 'out' keyword
et si vous spécifiezout
ainsi quenew
vous obtenezA ref or out argument must be an assignable variable
.Si vous voulez savoir si une chaîne est un nombre, vous pouvez toujours essayer de l'analyser:
Noter que
TryParse
renvoie unebool
, que vous pouvez utiliser pour vérifier si votre analyse réussi.Double.TryParse
Mise à JOUR de Kunal Noel Réponse
Mais, pour ce cas, nous avons que les cordes à vide va passer ce test, vous pouvez donc:
Avec c# 7, vous pouvez inline les variables:
L'utilisation de ces méthodes d'extension pour distinguer clairement entre une vérifier si la chaîne est numérique et si la chaîne seulement contient de 0 à 9 chiffres
La meilleure solution souple avec .net fonction intégrée appelée-
char.IsDigit
. Il fonctionne avec un nombre illimité de numéros longs. Il ne retournera vrai si chaque caractère est un nombre numérique. Je l'ai utilisé beaucoup de fois sans aucun problème et beaucoup plus facilement solution plus propre que j'ai jamais trouvé. J'ai fait un exemple de la méthode.Son prêt à l'emploi. En outre, j'ai ajouté de validation pour les nuls et vides d'entrée. Donc la méthode est maintenant totalement à l'épreuve des ballesEspère que cette aide
Tirer dans la référence Visual Basic dans votre projet et l'utilisation de ses Informations.IsNumeric méthode comme indiqué ci-dessous et être en mesure de capturer des chars ainsi que des entiers, à la différence de la réponse au-dessus de laquelle seulement les captures ints.
IsNumeric
fait une analyse du caractère de la chaîne. Ainsi, un nombre comme9999999999999999999999999999999999999999999999999999999999.99999999999
vous inscrire en tant queTrue
, même si il n'y a aucun moyen de représenter ce nombre à l'aide d'une norme de type numérique.Essayez les reges ci-dessous
Toutes les Réponses sont Utiles. Mais alors que la recherche d'une solution dans laquelle la valeur Numérique est de 12 chiffres ou plus (dans mon cas), puis pendant le débogage, j'ai trouvé la solution suivante utiles :
Ème variable résultat va vous donner le vrai ou le faux.
Ici est la méthode C#.
Int.Méthode TryParse (String, Int32)