J'ai un champ BigDecimal
amount
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).
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.
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.
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 ).
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
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
BigDecimal(19.0001).setScale(2, BigDecimal.RoundingMode.DOWN)