La plus élégante façon de détecter si une Chaîne est un nombre?
Est-il de meilleure qualité, plus élégant (et/ou éventuellement plus rapide) que de la manière
boolean isNumber = false;
try{
Double.valueOf(myNumber);
isNumber = true;
} catch (NumberFormatException e) {
}
...?
Modifier:
Puisque je ne peux pas choisir deux réponses, je vais avec les regex car a) il est élégant et b) en disant: "Jon Skeet résolu le problème" est une tautologie, car Jon Skeet est lui-même la solution à tous les problèmes.
C'est la façon dont j'ai fait des choses lors de la saisie de l'utilisateur est nécessaire pour être un certain nombre. Jamais tombée sur autre chose cependant.
J'ai posé une question très semblable d'un moment de retour. Certaines de ces réponses pourraient vous aider. stackoverflow.com/questions/237159/...
Jajajajaja bonne réponse Epaga.
J'ai posé une question très semblable d'un moment de retour. Certaines de ces réponses pourraient vous aider. stackoverflow.com/questions/237159/...
Jajajajaja bonne réponse Epaga.
OriginalL'auteur Epaga | 2008-12-11
Vous devez vous connecter pour publier un commentaire.
Je ne crois pas qu'il n'y a rien construit en Java pour le faire plus rapidement et toujours de manière fiable, en supposant que, plus tard, vous aurez vraiment envie de l'analyser avec le Double.valueOf (ou similaire).
J'avais utiliser des Doubles.parseDouble au lieu du Double.valueOf pour éviter la création d'un Double inutilement, et vous pouvez également vous débarrasser de façon flagrante idiot numéros plus rapide que l'exception en vérifiant les chiffres, e/E, et . à l'avance. Donc, quelque chose comme:
Noter que malgré la prise d'un couple de tente, ce encore ne couvre pas "NaN" ou des valeurs hexadécimales. Si vous voulez les passer ou pas ne dépend pas du contexte.
Dans mon expérience, les expressions régulières sont plus lentes que les codée en dur à contrôler.
..ou de retour d'une petite classe avec un booléen et un double, ou d'utiliser un hors des limites du terrain double, selon le besoin.
En effet. À ce stade, vous avez mis en œuvre .NET "bool Double.TryParse(string texte, double). En Java, une alternative serait de retour d'un lit Double (objet) ou null pour les "nuls".
Pssst... +1.0 e-7 est valable double.
Pssst... il échouera toujours. Il y a deux signes possibles dans un double: précédant la mantisse et après l'e/E, et un signe peut être un"+". Il y a en fait une leçon ici, qui est que la spécification pour un double est plus compliqué que votre code: de mieux à faire si ("0123456789eE-+".Contient(c)) continue;
OriginalL'auteur Jon Skeet
Vous pouvez utiliser une expression régulière, c'est à dire quelque chose comme
String.matches("^[\\d\\-\\.]+$");
(si vous n'êtes pas de test pour les nombres négatifs ou des nombres à virgule flottante vous pouvez simplifier un peu).Pas sûr que cela serait plus rapide que la méthode que vous avez décrites.
Edit: à la lumière de toute cette controverse, j'ai décidé de faire un test et obtenir quelques données sur la façon rapide de chacune de ces méthodes ont été. Non pas tant l'exactitude, mais juste comment rapidement ils ont couru.
Vous pouvez lire à propos de mes résultats sur mon blog. (Astuce: Jon Skeet FTW).
Je vais éditer le post pour faire de ce point 🙂
Personne n'a testé pour voir si une regexp est plus rapide ou plus lent que Jon Skeet la méthode ci-dessous? La regexp est certainement plus propre si vous pouvez en trouver un qui fonctionne pour les numéros que vous attendez.
Certaines personnes, lorsqu'ils sont confrontés à un problème, pense que "je sais, je vais utiliser des expressions régulières." Maintenant, ils ont deux problèmes. 😉
J'ai fait des tests avec .NET il y a des siècles et regexes ont été beaucoup plus lents. Si vous souhaitez utiliser une regex, à moins construit une fois et de le compiler 🙂 (je pense qu'elle le sera encore plus lent. Btw, mon code couvre maintenant un peu plus de cas qu'il a fait à l'origine, et ça commence à devenir compliqué...)
OriginalL'auteur
Voir java.texte.NumberFormat (javadoc).
"Communauté mondiale" - vous devez avoir la bonne paramètres régionaux de mise en forme et l'analyse. 1.024,00 en Allemagne est de 1 024.00 à Paris et 1 024.00 à New York.
OriginalL'auteur Ran Biron
La bonne regex est donné dans le Double javadoc:
Cela ne permet pas pour localisées représentations, cependant:
OriginalL'auteur Michael Myers
Utilisation
StringUtils.isDouble(String)
dans Apache Commons.OriginalL'auteur Nick Holt
Profitant de M. Skeet:
1
me fait faux quand il doit être vrai 😛OriginalL'auteur plinth
Je voudrais utiliser le Jakarta commons-lang, comme toujours ! Mais je n'ai aucune idée si leur mise en œuvre est rapide ou non. Il ne marche pas compter sur les Exceptions, qui peut être une bonne thig performance sage ...
Cela dépend de ce que vous voulez faire. Il y a des nombres qui ne sont pas représentable comme Java double - devraient-ils être inclus ou pas? Si vous voulez vraiment savoir si vous aurez finalement être en mesure de convertir en Java double, je pense que vous aurez du mal à le faire de manière fiable, sans un appel à la Double.
OriginalL'auteur Guillaume
La plupart de ces réponses sont un peu des solutions acceptables. Tous les regex solutions de la question des ne pas être correcte pour tous les cas, vous pouvez s'inquiéter.
Si vous voulez vraiment vous assurer que la Chaîne est un nombre valide, alors je voudrais utiliser votre propre solution. N'oubliez pas que, j'imagine, que la plupart du temps, la Chaîne sera un valide nombre et ne lèvera une exception. Ainsi, la plupart du temps, les performances seront identiques à celui de la Double.valueOf().
Je suppose que ce n'est pas vraiment une réponse, sauf qu'il valide votre premier instinct.
Randy
Je vois ce que vous dites. Si le but est simplement de détecter les chiffres, puis sur [0-9]+ serait de travailler.
OriginalL'auteur Randy Stegbauer
Suivantes Phill réponse puis-je suggérer une autre expression régulière?
OriginalL'auteur bruno conde
Je préfère utiliser une boucle sur les Chaînes de caractères de type char[] de la représentation et de l'utilisation du Personnage.appel isdigit() la méthode. Si l'élégance est souhaité, je pense que c'est le plus lisible:
}
OriginalL'auteur
Si vous voulez quelque chose qui est blisteringly rapide, et vous avez une idée très claire de ce que les formats que vous souhaitez accepter, vous pouvez construire une machine d'état DFA à la main. C'est essentiellement la façon dont regexes travail sous le capot de toute façon, mais vous pouvez éviter la regex étape de compilation de cette façon, et c'est peut-être bien plus rapide qu'un générique regex compilateur.
OriginalL'auteur Draemon