Salut,
Deux conseils :
- Force la locale : par défaut c'est celle de l'OS qui sera utilisé (Français ?) et donc c'est la virgule qui est utilisé comme séparateur des décimales :
NumberFormat nf = new DecimalFormat("#0.0###E0#", DecimalFormatSymbols.getInstance(Locale.US));
- N'utilise pas parse(String) mais parse(String,ParsePosition) :
- parse(String) ne traitera pas forcément la totalité de la chaine, et ne renvoi une exception que dans le cas où il ne trouve aucun chiffre valide. Dans ton cas il trouve -0 puis s'arrête car il considère le point comme un caractère invalide...
- parse(String,ParsePosition) ne renvoi aucune exception mais renseigne l'objet ParsePosition sur la position à laquelle il s'est arrêté, et il est ainsi possible de vérifier si la chaine a été traiter dans sa totalité ou non. Par exemple voici une méthode qui remonte une exception si la chaine n'est pas complètement traitée :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public static Number parseFull(NumberFormat nf, String source) throws ParseException {
// On traitera la chaine en entrée à partir de son début (index == 0)
ParsePosition pp = new ParsePosition(0);
// On parse la chaine en entrée :
Number number = nf.parse(source, pp);
// Si la méthode parse a détecté une erreur (aucun caractère valide)
if (pp.getErrorIndex()>=0) {
// On remonte une exception
throw new ParseException("Unparseable number: \"" + source + "\"", pp.getErrorIndex());
}
// Si on n'a pas traité toute la chaine de caractère :
if (pp.getIndex()!=source.length()) {
// On remonte une exception
throw new ParseException("Unparseable number: \"" + source + "\"", pp.getIndex());
}
// Sinon on peut retourner le nombre :
return number;
} |
A noter que dans ton cas tu pourrais très bien utiliser le formatter par défaut :
NumberFormat nf = NumberFormat.getNumberInstance(Locale.US);
a++
Partager