MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 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.
Et parse number c'est la fonction qui parcours le char* charactere par charactere.
bucherb
Messages postés412Date d'inscriptionlundi 26 mai 2003StatutMembreDernière intervention13 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és3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 15 déc. 2005 à 11:49
Une seule ca reste encore suffisant ;)
Merci pour ces précisions TheSaib :)
TheSaib
Messages postés2367Date d'inscriptionmardi 17 avril 2001StatutMembreDernière intervention26 décembre 200723 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és412Date d'inscriptionlundi 26 mai 2003StatutMembreDernière intervention13 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és2367Date d'inscriptionmardi 17 avril 2001StatutMembreDernière intervention26 décembre 200723 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és3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 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és305Date d'inscriptionlundi 7 janvier 2002StatutMembreDernière intervention10 août 20117 13 déc. 2005 à 16:06
TryParse lève des exceptions ? Ha bon ?
cs_vladam
Messages postés216Date d'inscriptiondimanche 13 janvier 2002StatutModérateurDerniè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és305Date d'inscriptionlundi 7 janvier 2002StatutMembreDernière intervention10 août 20117 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és475Date d'inscriptionjeudi 19 juin 2003StatutMembreDernière intervention 3 novembre 20081 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és2367Date d'inscriptionmardi 17 avril 2001StatutMembreDernière intervention26 décembre 200723 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és13Date d'inscriptionmercredi 12 octobre 2005StatutMembreDernière intervention13 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és2367Date d'inscriptionmardi 17 avril 2001StatutMembreDernière intervention26 décembre 200723 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és3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 12 déc. 2005 à 13:05
Je suis d'accord
cs_vladam
Messages postés216Date d'inscriptiondimanche 13 janvier 2002StatutModérateurDerniè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és1522Date d'inscriptionmardi 18 décembre 2001StatutMembreDernière intervention21 août 20108 12 déc. 2005 à 12:23
Avec une Reg Ex ca semble plus simple :)
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 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();
cs_badrbadr
Messages postés475Date d'inscriptionjeudi 19 juin 2003StatutMembreDernière intervention 3 novembre 20081 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és3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 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és13Date d'inscriptionmercredi 12 octobre 2005StatutMembreDernière intervention13 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és908Date d'inscriptionjeudi 26 juillet 2001StatutModérateurDernière intervention 1 février 20152 11 déc. 2005 à 15:54
28 mai 2018 à 19:26
20 sept. 2007 à 15:24
Microsoft.VisualBasic.Information.IsNumeric(expr);
15 déc. 2005 à 11:56
15 déc. 2005 à 11:55
{
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.
15 déc. 2005 à 11:49
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
15 déc. 2005 à 11:49
Merci pour ces précisions TheSaib :)
15 déc. 2005 à 11:46
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 :)
15 déc. 2005 à 10:51
Chuis pret à parier que cette fonction utilise déjà une expression régulière :-p
13 déc. 2005 à 23:38
13 déc. 2005 à 16:13
13 déc. 2005 à 16:06
13 déc. 2005 à 12:00
13 déc. 2005 à 11:51
Regex(@"(^[-+]?\d+(,?\d*)*\.?\d*([Ee][-+]\d*)?$)|(^[-+]?\d?(,?\d*)*\.\d+([Ee][-+]\d*)?$)");
ça semble plus simple que ça :
Int32.TryParse();
mdr ! :-) :-)
13 déc. 2005 à 05:12
12 déc. 2005 à 23:05
Tiens une qui marche
Regex r = new Regex(@"(^[-+]?\d+(,?\d*)*\.?\d*([Ee][-+]\d*)?$)|(^[-+]?\d?(,?\d*)*\.\d+([Ee][-+]\d*)?$)");
12 déc. 2005 à 21:03
12 déc. 2005 à 14:38
public static bool isNumeric(string value)
{
return(System.Text.RegularExpressions.Regex.IsMatch(value,"^[-0-9]*.[.0-9].[0-9]*$"));
}
12 déc. 2005 à 13:05
12 déc. 2005 à 12:41
12 déc. 2005 à 12:23
11 déc. 2005 à 22:05
Cependant, le catch d'exception est couteux en perfs. En .Net 2, on preferera utiliser Int32.TryParse();
http://msdn2.microsoft.com/library/f02979c7.aspx
11 déc. 2005 à 21:45
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.
11 déc. 2005 à 20:08
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 ;)
11 déc. 2005 à 19:37
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.
11 déc. 2005 à 15:54
11 déc. 2005 à 13:45
Ainsi
public bool IsNumeric(string str)
{
foreach(char c in str)
{
if(!char.isNumber(c)) return false;
}
return true;
}