web-dev-qa-db-fra.com

Comment imprimer les valeurs BigDecimal formatées?

J'ai un champ BigDecimalamount qui représente de l'argent et j'ai besoin d'imprimer sa valeur dans le navigateur dans un format tel que $123.00, $15.50, $0.33.

Comment puis je faire ça?

(La seule solution simple que je vois moi-même consiste à obtenir floatValue de BigDecimal puis à utiliser NumberFormat pour créer une précision à deux chiffres pour la partie fraction).

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

Il utilisera la valeur par défaut actuelle de votre machine virtuelle Locale pour choisir votre symbole monétaire. Ou vous pouvez spécifier un Locale.

NumberFormat.getInstance(Locale.US)

Pour plus d'informations, voir NumberFormat classe.

115
Luca Molteni

Pour définir le séparateur de milliers, dites 123,456.78 vous 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 je mette #,###.00 mask, il formate avec succès les valeurs les plus longues. Notez que le séparateur de virgule (,) dans le résultat dépend de vos paramètres régionaux. Ce peut être juste un espace () pour les paramètres régionaux russes.

56
Jeff_Alieffson

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 dépassant deux décimales, cela n'a pas de sens. Prenant cela un peu 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 second argument de mode d'arrondi pour contrôler la gestion de la dernière décimale. Dans certaines situations, Java vous oblige à spécifier cette méthode d'arrondi ).

33
demongolem
 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

10
Fluch

Semblable à répondre par @Jeff_Alieffson, mais sans s'appuyer sur la valeur par défaut Locale:

Utilisez DecimalFormatSymbols pour les paramètres régionaux explicites:

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

Ou symboles de séparateur explicites:

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

Ensuite:

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

Résultat:

12 345.00
2
volkovs
BigDecimal(19.0001).setScale(2, BigDecimal.RoundingMode.DOWN)
1
Dima