842 votes

Déterminer si une chaîne de caractères est un nombre

Si j'ai ces cordes :

  1. "abc" = false

  2. "123" = true

  3. "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 ?

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"

1347voto

mquander Points 32650
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 !

146 votes

Cependant, j'utiliserais double.TryParse, puisque nous voulons savoir s'il représente un nombre.

7 votes

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.

15 votes

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.

378voto

John M Gant Points 6147

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.

2 votes

Construire la regex une fois pour toutes serait cependant beaucoup plus efficace.

2 votes

@CFP +1...Les RegEx sont toujours mieux que les fonctions habituelles, quand elles sont applicables !

22 votes

@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.

137voto

nmiranda Points 2301

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

alt text
(source : <a href="http://aspalliance.com/images/articleimages/80/Figure1.gif" rel="noreferrer">aspalliance.com </a>)

alt text
(source : <a href="http://aspalliance.com/images/articleimages/80/Figure2.gif" rel="noreferrer">aspalliance.com </a>)

90 votes

Faire référence à Microsoft.VisualBasic.dll à partir d'une application C# ? eww :P

0 votes

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.

12 votes

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.

33voto

Euro Micelli Points 12845

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.

0 votes

Pourquoi TryParse est-il préférable à la comparaison de tous les caractères avec des caractères entiers ?

26voto

TheTXI Points 24470

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

0 votes

Je pense que j'ai fait cela plus dans le style de syntaxe VB que C#, mais les mêmes règles s'appliquent.

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