Comportement étrange de NumberFormat Java
-
20-09-2019 - |
Question
Je le code suivant pour analyser une variable de chaîne appelée str.
NumberFormat formatter = NumberFormat.getInstance();
Number number = formatter.parse(str);
Je veux attraper l'exception lancée quand str est pas un nombre juste pour le valider. Le problème, c'est qu'il does't jette toujours le ParseException attendu. Lorsque la chaîne str commence par un nombre mais sont des caractères, il semble avoir un des premiers caractères de la chaîne et les analyser comme un nombre.
Par exemple:
- si str = "a10" est alors jeté un ParseException
- si str = "10a", alors pas d'exception levée et numéro = 10
Je ne peux pas utiliser Double.parseDouble (str) car str peut avoir des virgules et des points comme 1,000.98 et ce format ne soit pas compris par cette méthode.
Pourquoi est-ce qui se passe? Puis-je valider toute autre manière? Merci
La solution
Le comportement est pas étrange, il est conçu comme
Parse texte à partir du début de la chaîne donnée pour produire un nombre. La méthode ne peut pas utiliser le texte intégral de la chaîne donnée.
Vous pouvez utiliser la méthode d'analyse de position consciente comme ceci:
public static double parse(String str) throws ParseException {
NumberFormat formatter = NumberFormat.getInstance();
ParsePosition position = new ParsePosition(0);
Number number = formatter.parse(str, position);
if (position.getIndex() != str.length()) {
throw new ParseException("failed to parse entire string: " + str, position.getIndex());
}
return number.doubleValue();
}
Autres conseils
Si vous regardez le API , il est dit clairement:
parse texte depuis le début de la étant donné la chaîne pour produire un nombre. le méthode ne peut pas utiliser l'intégralité du texte la chaîne donnée.
Si vous voulez voir dans quelle mesure l'analyseur analysé, vous pouvez utiliser le autre mode de position courant . De cette façon, vous pouvez vérifier si vous avez des caractères arrière. Vous pouvez également vérifier l'ensemble de la chaîne de caractères alphanumériques à l'aide par exemple Langs communs isAlpha .