Bonjour,
j'essaie de parser une ce nombre -0.1235E-12 avec la classe DecimalFormat et le pattern "#0.0###E0#". Ca me retourne bien un double, mais qui vaut -0.0
une idée ?
Merci. :king:
Version imprimable
Bonjour,
j'essaie de parser une ce nombre -0.1235E-12 avec la classe DecimalFormat et le pattern "#0.0###E0#". Ca me retourne bien un double, mais qui vaut -0.0
une idée ?
Merci. :king:
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 :
Code: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 :
Code:
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 :
a++Code:NumberFormat nf = NumberFormat.getNumberInstance(Locale.US);
merci
Je rajoute une question à ce thread.
Je me suis rendu compte que mon pattern ne parsait un nombre qu'avec un exposant négative.
Par exemple, si j'ai un le nombre "1.0570410E+02", le parse ne prends pas en compte l'exposant.
Y a t'il une solution à ce problème ?
Merci.