FONCTION ISNUMERIC() POUR C#.NET

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 - 11 déc. 2005 à 13:45
 abc - 28 mai 2018 à 19:26
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/35028-fonction-isnumeric-pour-c-net


private bool IsDigitsOnly(string str)
{
foreach (char c in str)
{
if (c < '0' || c > '9') { return false; }
}

return true;
}
fouedelapoche Messages postés 36 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 30 octobre 2009
20 sept. 2007 à 15:24
sinon on peut aussi faire :

Microsoft.VisualBasic.Information.IsNumeric(expr);
bucherb Messages postés 412 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 13 août 2007
15 déc. 2005 à 11:56
Cool! Merci pour les précisions!
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
15 déc. 2005 à 11:55
private static unsafe bool TryStringToNumber(string str, NumberStyles options, ref Number.NumberBuffer number, NumberFormatInfo numfmt, bool parseDecimal)
{
if (str == null)
{
return false;
}
fixed (char* local1 = str)
{
char* chPtr1 = local1;
char* chPtr2 = chPtr1;
if (!Number.ParseNumber(ref chPtr2, options, ref number, numfmt, parseDecimal) || ((((long) ((chPtr2 - chPtr1) / 2)) < str.Length) && !Number.TrailingZeros(str, (int) ((long) ((chPtr2 - chPtr1) / 2)))))
{
return false;
}
}
return true;
}

Et parse number c'est la fonction qui parcours le char* charactere par charactere.
bucherb Messages postés 412 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 13 août 2007
15 déc. 2005 à 11:49
Hey j'ai dis que j'étais "pret" à parier, pas que je pariais :-p Rend-moi ma couille gauche!

Bon pis Number.TryStringToNumber il fait quoi?

Y a pas de gros try catch de bourrin comme je pensais, c'est déjà bien non? :-p
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
15 déc. 2005 à 11:49
Une seule ca reste encore suffisant ;)
Merci pour ces précisions TheSaib :)
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
15 déc. 2005 à 11:46
Attention tu mets ta couille gauche sur la table.
Je vais verifier.

Verdict :
internal static unsafe bool TryParseInt32(string s, NumberStyles style, NumberFormatInfo info, out int result)
{
byte* numPtr1 = (byte*) stackalloc byte[(1 * 0x72)];
Number.NumberBuffer buffer1 = new Number.NumberBuffer(numPtr1);
result = 0;
if (!Number.TryStringToNumber(s, style, ref buffer1, info, false))
{
return false;
}
if ((style & NumberStyles.AllowHexSpecifier) != NumberStyles.None)
{
if (!Number.HexNumberToInt32(ref buffer1, ref result))
{
return false;
}
}
else if (!Number.NumberToInt32(ref buffer1, ref result))
{
return false;
}
return true;
}

Et quand tu regars les appels de fonctions, tu vois qu'il parcours les charactères un par un.

Il ne te reste que la droite :)
bucherb Messages postés 412 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 13 août 2007
15 déc. 2005 à 10:51
Il semblerait que le TryParse de .NET 2 soit super rapide. Il n'a pas l'air de faire un gros try catch de bourrin à l'intérieur puisqu'il met le même temps pour parser un "5" et un "toto"...

Chuis pret à parier que cette fonction utilise déjà une expression régulière :-p
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
13 déc. 2005 à 23:38
Et je ne suis pas sûr au niveau des performances de ce qui est préférable, un tryParse ou une regexp compilé....
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
13 déc. 2005 à 16:13
Non ca ne leve pas d'exception, mais comme dit plus haut, int32.TryParse, c'est que Framework 2.0 :/
cs_yoannd Messages postés 305 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 août 2011 7
13 déc. 2005 à 16:06
TryParse lève des exceptions ? Ha bon ?
cs_vladam Messages postés 216 Date d'inscription dimanche 13 janvier 2002 Statut Modérateur Dernière intervention 7 novembre 2009
13 déc. 2005 à 12:00
Disons que déclencher une exception pour vérifier une syntaxe, c'est moyen quand même, tu en conviendras
cs_yoannd Messages postés 305 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 août 2011 7
13 déc. 2005 à 11:51
C'est vrai que ça :
Regex(@"(^[-+]?\d+(,?\d*)*\.?\d*([Ee][-+]\d*)?$)|(^[-+]?\d?(,?\d*)*\.\d+([Ee][-+]\d*)?$)");

ça semble plus simple que ça :
Int32.TryParse();

mdr ! :-) :-)
cs_badrbadr Messages postés 475 Date d'inscription jeudi 19 juin 2003 Statut Membre Dernière intervention 3 novembre 2008 1
13 déc. 2005 à 05:12
olala, il faudra que j'apprenne ces expressions régulières un de ces jours, elles sont drolement utile (hahahahah, que c est drolement utile)
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
12 déc. 2005 à 23:05
Parcequ'elle marche pas pourquoi ? :>

Tiens une qui marche

Regex r = new Regex(@"(^[-+]?\d+(,?\d*)*\.?\d*([Ee][-+]\d*)?$)|(^[-+]?\d?(,?\d*)*\.\d+([Ee][-+]\d*)?$)");
spottydj Messages postés 13 Date d'inscription mercredi 12 octobre 2005 Statut Membre Dernière intervention 13 juillet 2008
12 déc. 2005 à 21:03
hmm je vais paraitre un peu idiot TheSaib, mais ne sachant pas comment fonctionne cette fonction, pourquoi elle me retourne toujours false quand je la teste ?
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
12 déc. 2005 à 14:38
J'appose ma pierre à l'édifice.


public static bool isNumeric(string value)
{
return(System.Text.RegularExpressions.Regex.IsMatch(value,"^[-0-9]*.[.0-9].[0-9]*$"));
}
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
12 déc. 2005 à 13:05
Je suis d'accord
cs_vladam Messages postés 216 Date d'inscription dimanche 13 janvier 2002 Statut Modérateur Dernière intervention 7 novembre 2009
12 déc. 2005 à 12:41
oui, je crois aussi, une rex ex est plus propre, adaptée et fiable
cs_Crazyht Messages postés 1522 Date d'inscription mardi 18 décembre 2001 Statut Membre Dernière intervention 21 août 2010 8
12 déc. 2005 à 12:23
Avec une Reg Ex ca semble plus simple :)
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
11 déc. 2005 à 22:05
Badrbadr > Oui, tu peux aussi faire comme ca.
Cependant, le catch d'exception est couteux en perfs. En .Net 2, on preferera utiliser Int32.TryParse();

http://msdn2.microsoft.com/library/f02979c7.aspx
cs_badrbadr Messages postés 475 Date d'inscription jeudi 19 juin 2003 Statut Membre Dernière intervention 3 novembre 2008 1
11 déc. 2005 à 21:45
on peut faire un truc du genre:
try
{
Int32.Parse(string);
}
catch
{
Console.WriteLine("ce nombre n'est pas un integer");
}

il faut des modifications pour les float et compagnie. Parse supporte le signe négatif a ma connaissance.
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
11 déc. 2005 à 20:08
Pour les nombres negatifs, oui il faut gérer le '-'.
De la meme facon, il faudra rajouter un return false si un des caracteres est le caractere ² qui est aussi considéré comme numérique.

Mon exemple n'etait qu'une ebauche rapide ;)
spottydj Messages postés 13 Date d'inscription mercredi 12 octobre 2005 Statut Membre Dernière intervention 13 juillet 2008
11 déc. 2005 à 19:37
En ce qui concerne la solution de MorpionMx,
Si le chiffre est négatif, le premier caractère est donc '-' et ne sera pas compté valide.
Pour la solution de Alain Proviste,
Le principe de TryParse est long, car il attend une exception.
cs_Alain Proviste Messages postés 908 Date d'inscription jeudi 26 juillet 2001 Statut Modérateur Dernière intervention 1 février 2015 2
11 déc. 2005 à 15:54
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
11 déc. 2005 à 13:45
Tu peux aussi utiliser la fonction char.IsNumber(char) pour savoir si un caractère donné est numérique ou non.

Ainsi

public bool IsNumeric(string str)
{
foreach(char c in str)
{
if(!char.isNumber(c)) return false;
}
return true;
}
Rejoignez-nous