Como imprimir valores BigDecimal formatados?

104

Eu tenho um BigDecimalcampo amountque representa o dinheiro, e eu preciso imprimir o seu valor no navegador em um formato como $123.00, $15.50, $0.33.

Como eu posso fazer isso?

(A única solução simples que eu me vejo está recebendo floatValuea partir de BigDecimale em seguida, usando NumberFormatpara fazer precisão de dois dígitos para a parte de fração).

romano
fonte

Respostas:

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

Ele usará o padrão atual do JVM Localepara escolher o símbolo da moeda. Ou você pode especificar um Locale.

NumberFormat.getInstance(Locale.US)

Para mais informações, consulte a NumberFormatclasse.

Luca Molteni
fonte
É possível especificar um padrão assim como DecimalFormat faz?
Philippe Gioseffi
70

Para definir o separador de milhar, digamos que 123,456.78você precise usar 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)));

Aqui está o resultado:

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

Embora eu tenha definido a #,###.00máscara, ela formata com sucesso os valores mais longos também. Observe que o separador de vírgula (,) no resultado depende de sua localidade. Pode ser apenas espaço () para a localidade russa.

Jeff_Alieffson
fonte
19
Se você preferir que zero seja exibido como 0,00 (em vez de .00), use o padrão "#,##0.00".
Jonik
35

Outra forma que pode fazer sentido para a situação dada é

BigDecimal newBD = oldBD.setScale(2);

Só digo isso porque, em alguns casos, quando se trata de dinheiro, ir além de 2 casas decimais não faz sentido. Indo um passo adiante, isso pode levar a

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

mas eu apenas queria destacar o método setScale (que também pode usar um segundo argumento de modo de arredondamento para controlar como a última casa decimal é tratada. Em algumas situações, Java força você a especificar esse método de arredondamento).

demongolem
fonte
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
fonte
6

Semelhante à resposta de @Jeff_Alieffson, mas não contando com o padrão Locale:

Use DecimalFormatSymbolspara localidade explícita:

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

Ou símbolos separadores explícitos:

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

Então:

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

Resultado:

12 345.00
Volkovs
fonte
1
BigDecimal(19.0001).setScale(2, BigDecimal.RoundingMode.DOWN)
Dima
fonte
1
Deve ser BigDecimal (19.001) .setScale (2, BigDecimal.ROUND_HALF_UP) .toString ()
Jeff Tsay