Je dois vérifier si une chaîne contient uniquement des chiffres. Comment pourrais-je y arriver en C #? Y a-t-il une fonction comme ISnumeric? P> P>
9 Réponses :
if (Regex.Match(str, @"^[0-9]+(\.[0-9]+)?$")) { // ok }
Quel devrait être le paramètre? Est-ce que cela acceptera une énorme chaîne? Y a-t-il des limitations?
Pour une énorme chaîne, vous avez besoin d'une regexp
Cela ne devrait-il pas être regex.Amachatch (), qui retourne un bool, pas correspondre (), qui retourne un match?
@imoatama merci pour le commentaire supplémentaire résolu pour moi
Je pense que vous pouvez utiliser des expressions régulières, dans la classe de regex p>
Regex.Amatch (YourStr, "\ d") p>
ou quelque chose comme ça hors du sommet de ma tête. p>
ou vous pouvez utiliser la méthode parse int.parse (...) p>
Cela devrait fonctionner:
bool isNum = Integer.TryParse(Str, out Num);
Int.Tryparse échouera sur son troisième cas de test de "123,67"
pris de MSDN (Comment implémenter Visual Basic Fonctionnalité ISnumérique à l'aide de Visual C # ):
// IsNumeric Function static bool IsNumeric(object Expression) { // Variable to collect the Return value of the TryParse method. bool isNum; // Define variable to collect out parameter of the TryParse method. If the conversion fails, the out parameter is zero. double retNum; // The TryParse method converts a string in a specified style and culture-specific format to its double-precision floating point number equivalent. // The TryParse method does not generate an exception if the conversion fails. If the conversion passes, True is returned. If it does not, False is returned. isNum = Double.TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInfo, out retNum ); return isNum; }
Cela devrait fonctionner, peu importe la durée de la taille de la chaîne:
string s = "12345"; bool iAllNumbers = s.ToCharArray ().All (ch => Char.IsDigit (ch) || ch == '.');
Qui correspondrait également à "123.456.789", qui n'est pas un nombre valide
@Philippe: Vous êtes correct. Je pense que le regexp est le moyen le plus propre d'aller ici.
@Tarydon System.Array ne contient pas de définition pour tous ?!
Utiliser des expressions régulières est le moyen le plus simple (mais pas le plus rapide):
Vous manquez le .23 code>.
Peut-être que si vous souhaitez autoriser des chiffres utilisés par Commodore 64 ordinateurs il y a 25 ans :-)
Désolé mon pote, mais C # l'accepte aussi, et le système et la plupart des langues avec IEEE POINT-POINT :)
Je ne dis pas que c # n'accepte pas ça. Ce n'est tout simplement pas quelque chose qu'un utilisateur moyen sortirait lors de la saisie d'un numéro. Je préférerais ne pas l'accepter comme une entrée valide d'un utilisateur, mais c'est juste mon opinion.
Si vous recevez la chaîne sous forme de paramètre, la manière la plus flexible serait d'utiliser RegEx comme décrit dans les autres messages. Si vous obtenez l'entrée de l'utilisateur, vous pouvez simplement accroître l'événement de la clé et ignorer toutes les clés qui ne sont pas des chiffres. De cette façon, vous serez sûr que vous n'avez que des chiffres. P>
Comme indiqué ci-dessus, vous pouvez utiliser double.Tryparse
Si vous n'aimez pas cela (pour une raison quelconque), vous pouvez écrire votre propre méthode d'extension: P>
string mystring = "123456abcd123"; if (mystring.isNumeric()) MessageBox.Show("The input string is a number."); else MessageBox.Show("The input string is not a number.");