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).

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.


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.


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).


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


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

1
BigDecimal(19.0001).setScale(2, BigDecimal.RoundingMode.DOWN)

1
Devrait être BigDecimal (19.001) .setScale (2, BigDecimal.ROUND_HALF_UP) .toString ()
Jeff Tsay
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.