web-dev-qa-db-fra.com

Meilleure façon de convertir une chaîne spécifique aux paramètres régionaux en BigDecimal

Je dois convertir une chaîne au format local allemand en BigDecimal. Cependant, je me bats avec la meilleure solution.

Le code suivant montre mon problème:

    String numberString = "2.105,88";

    NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
    try {
        Number parsed = nf.parse(numberString);
        BigDecimal bd1 = new BigDecimal(parsed.toString());
        System.out.println(bd1.toString());

        BigDecimal bd2 = new BigDecimal(parsed.doubleValue());
        System.out.println(bd2);

        BigDecimal bd3 = new BigDecimal(numberString);
        System.out.println(bd3);

    } catch (ParseException e) {
        e.printStackTrace();
    }

La sortie de ceci est

2105.88

2105.8800000000001091393642127513885498046875

Exception dans le thread "principal" Java.lang.NumberFormatException à Java.math.BigDecimal. (Source inconnue) à Java.math.BigDecimal. (Source inconnue) à test.BigDecimalTest.main (BigDecimalTest.Java:22)

La première sortie est correcte, mais cela n'a pas vraiment de sens de convertir un String en Number (Double pour être précis), puis de nouveau en String puis à nouveau dans un type spécifique de Number, BigDecimal.

La deuxième sortie est incorrecte, mais pourrait être résolue en définissant l'échelle du BigDecimal. Cependant, le nombre de chiffres n'est pas toujours connu.

La troisième sortie n'est évidemment pas ce que je recherche.

Ma question, quelle serait la meilleure façon? Y a-t-il de meilleures façons de procéder?

30
Gijs Overvliet

Il semble qu'il n'y ait pas d'autre moyen puisque Java.Lang.Number n'a pas de méthode qui retourne un type BigDecimal. Quoi qu'il en soit, cela a du sens car BigDecimal n'accepte que des chaînes correctement formatées non pas comme "" 2.105,88 "mais comme" 2105.88 "Permettez-moi de montrer votre code:

import Java.math.BigDecimal;
import Java.text.DecimalFormat;
import Java.text.NumberFormat;
import Java.text.ParseException;
import Java.util.Locale;
public class JavaMain {
    public static void main(String[] args) {
        String numberString = "2.105,88";
        //using casting
        try {
            DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(Locale.GERMAN);
            df.setParseBigDecimal(true);
            BigDecimal bd = (BigDecimal) df.parseObject(numberString);
            System.out.println(bd.toString());
        } catch (ParseException e) {
            e.printStackTrace();
        }
        //your way short version
        NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
        try {
            BigDecimal bd1 = new BigDecimal(nf.parse(numberString).toString());
            System.out.println(bd1.toString());
        } catch (ParseException e) {
            e.printStackTrace();
        }
        String numberStringFixed = "2105.88";
        //direct string formated
        System.out.println(new BigDecimal(numberStringFixed));;     
        //direct but erroneous way if the string is not formated
        System.out.println(new BigDecimal(numberString));;

    }
}

J'espère que ça aide!

34
PbxMan

DecimalFormat a une méthode appelée setParseBigDecimal qui fait que parse() retourne un BigDecimal. Il vous suffit de transtyper le Number retourné.

12
Jarett Millard