2010-02-15 7 views
6

J'ai le code suivant pour analyser une variable String appelée str.Comportement étrange de NumberFormat Java

Je veux attraper l'exception levée quand str n'est pas un nombre juste pour le valider. Le problème que j'ai est qu'il ne lance pas toujours le ParseException prévu. Lorsque la chaîne Str commence par un nombre mais que ce sont des caractères, il semble obtenir les premiers caractères de la chaîne et les analyser comme un nombre.

Par exemple:

  • si str = "a10", puis est jeté un ParseException
  • si str = "10a", alors pas d'exception levée et le nombre = 10

Je ne peux pas utiliser Double.parseDouble (str) parce que str peut avoir des virgules et des points comme 1.000.98 et ce format n'est pas compris par cette méthode.

Pourquoi cela se produit-il? Puis-je le valider d'une autre manière? Merci

+1

Je ne voulais pas que le comportement de NumberFormat avait tort, mais je l'avais mal compris l'API. Je pensais que la position devait indiquer jusqu'à quel personnage je voulais analyser la corde. Maintenant, je comprends pourquoi c'est conçu de cette manière. Merci pour toutes vos réponses. – Javi

Répondre

6

Le comportement est pas étrange, il est conçu comme

texte Parsis depuis le début de la chaîne donnée pour produire un nombre. La méthode peut ne pas utiliser le texte entier 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(); 
} 
+0

Utile pour moi: utilisez 'setParseIntegerOnly (true)' pour lancer une exception si vous trouvez un Float en attendant un Integer – xdola

6

Si vous regardez le API, il dit clairement:

texte Parsis depuis le début de la chaîne donnée pour produire un nombre. La méthode ne peut pas utiliser le texte entier de la chaîne donnée.

Si vous voulez voir dans quelle mesure l'analyseur est analysé, vous pouvez utiliser le other position-aware method. De cette façon, vous pouvez vérifier si vous avez des caractères de fin. Vous pouvez également vérifier toute la chaîne pour les caractères alphanumériques en utilisant par exemple les langages communs isAlpha.

+0

Désolé sfussenegger, n'a pas vu votre message avant que je mis à jour avec la méthode de prise de position. –

+0

@disown probablement parce que vous avez été plus rapide que moi;) – sfussenegger