Comment imprimer des valeurs BigDecimal formatées?

104

J'ai un BigDecimaldomaine amountqui représente l' argent, et je dois imprimer sa valeur dans le navigateur dans un format comme $123.00, $15.50, $0.33.

Comment puis je faire ça?

(La seule solution simple que je me vois est d' obtenir à floatValuepartir BigDecimalet puis en utilisant NumberFormatpour faire une précision à deux chiffres pour la partie de fraction).

romain
la source

Réponses:

135
public static String currencyFormat(BigDecimal n) {
    return NumberFormat.getCurrencyInstance().format(n);
}

Il utilisera la valeur par défaut actuelle de votre JVM Localepour choisir votre symbole de devise. Ou vous pouvez spécifier un Locale.

NumberFormat.getInstance(Locale.US)

Pour plus d'informations, consultez la NumberFormatclasse.

Luca Molteni
la source
Est-il possible de spécifier un modèle comme le fait DecimalFormat?
Philippe Gioseffi le
71

Pour définir un séparateur de milliers, disons que 123,456.78vous devez utiliser DecimalFormat :

     DecimalFormat df = new DecimalFormat("#,###.00");
     System.out.println(df.format(new BigDecimal(123456.75)));
     System.out.println(df.format(new BigDecimal(123456.00)));
     System.out.println(df.format(new BigDecimal(123456123456.78)));

Voici le résultat:

123,456.75
123,456.00
123,456,123,456.78

Bien que j'aie défini un #,###.00masque, il formate également avec succès les valeurs les plus longues. Notez que le séparateur virgule (,) dans result dépend de vos paramètres régionaux. Ce peut être juste un espace () pour les paramètres régionaux russes.

Jeff_Alieffson
la source
19
Si vous préférez que zéro soit affiché comme 0.00 (au lieu de .00), utilisez "#,##0.00"plutôt le modèle .
Jonik
35

Une autre façon qui pourrait avoir un sens pour la situation donnée est

BigDecimal newBD = oldBD.setScale(2);

Je dis simplement cela parce que dans certains cas, quand il s'agit d'argent qui dépasse 2 décimales, cela n'a pas de sens. En allant plus loin, cela pourrait conduire à

String displayString = oldBD.setScale(2).toPlainString();

mais je voulais simplement mettre en évidence la méthode setScale (qui peut également prendre un deuxième argument de mode d'arrondi pour contrôler la façon dont cette dernière décimale est gérée. Dans certaines situations, Java vous oblige à spécifier cette méthode d'arrondi).

démongolem
la source
14
 BigDecimal pi = new BigDecimal(3.14);
 BigDecimal pi4 = new BigDecimal(12.56);

 System.out.printf("%.2f",pi);

// imprime 3.14

System.out.printf("%.0f",pi4);

// imprime 13

Fluch
la source
6

Similaire à la réponse de @Jeff_Alieffson, mais sans compter sur la valeur par défaut Locale:

Utiliser DecimalFormatSymbolspour les paramètres régionaux explicites:

DecimalFormatSymbols decimalFormatSymbols  = DecimalFormatSymbols.getInstance(new Locale("ru", "RU"));

Ou symboles de séparation explicites:

DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
decimalFormatSymbols.setDecimalSeparator('.');
decimalFormatSymbols.setGroupingSeparator(' ');

Ensuite:

new DecimalFormat("#,##0.00", decimalFormatSymbols).format(new BigDecimal("12345"));

Résultat:

12 345.00
Volkovs
la source
1
BigDecimal(19.0001).setScale(2, BigDecimal.RoundingMode.DOWN)
Dima
la source
1
Devrait être BigDecimal (19.001) .setScale (2, BigDecimal.ROUND_HALF_UP) .toString ()
Jeff Tsay