Dans mon expérience limitée, j'ai été sur plusieurs projets qui ont eu une sorte de classe utilitaire de chaîne avec des méthodes pour déterminer si une chaîne donnée est un nombre. L'idée a toujours été la même, mais la mise en œuvre a été différente. Certains entourent une tentative d'analyse avec try/catchMeilleure implémentation pour une méthode isNumber (chaîne)
public boolean isInteger(String str) {
try {
Integer.parseInt(str);
return true;
} catch (NumberFormatException nfe) {}
return false;
}
et d'autres correspondent à regex
public boolean isInteger(String str) {
return str.matches("^-?[0-9]+(\\.[0-9]+)?$");
}
Est-ce une de ces méthodes mieux que l'autre? Personnellement, je préfère utiliser l'approche regex, car elle est concise, mais sera-t-elle performante au pair si elle est appelée en parcourant, par exemple, une liste de plusieurs centaines de milliers de chaînes?
Note: Comme je suis un peu nouveau sur le site, je ne comprends pas très bien cette activité Wiki de la communauté, donc si cela doit être le cas, faites-le moi savoir, et je le changerai volontiers.
EDIT: Avec toutes les suggestions que je TryParse le code de référence de Ported Asaph (merci pour un grand poste!) À C# et a ajouté une méthode TryParse. Et comme il semble, le TryParse gagne haut la main. Cependant, l'approche try catch a pris beaucoup de temps. Au point de penser que j'ai fait quelque chose de mal! J'ai également mis à jour regex pour gérer les négatifs et les points décimaux.
Résultats pour mise à jour, C# Code de référence:
00:00:51.7390000 for isIntegerParseInt
00:00:03.9110000 for isIntegerRegex
00:00:00.3500000 for isIntegerTryParse
utilisant:
static bool isIntegerParseInt(string str) {
try {
int.Parse(str);
return true;
} catch (FormatException e){}
return false;
}
static bool isIntegerRegex(string str) {
return Regex.Match(str, "^-?[0-9]+(\\.[0-9]+)?$").Success;
}
static bool isIntegerTryParse(string str) {
int bob;
return Int32.TryParse(str, out bob);
}
Je pense que TryParse est le meilleur moyen –
Quelles sont vos entrées attendues? Attendez-vous que 99% du temps la chaîne * sera * un nombre, et seulement 1% du temps * ne le sera pas? Ou est-ce l'inverse? Vous voulez optimiser la branche de code qui va réellement être exercée dans la plupart des cas. –
Ajouté, puis supprimez la balise C#. :) –