Como imprimir valores BigDecimal formatados?

Eu tenho um amount campo BigDecimal que representa dinheiro, e eu preciso imprimir 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 vejo a mim mesmo é obter floatValue do BigDecimal e depois usar NumberFormat para fazer uma precisão de dois dígitos para a parte fracionária).

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

Ele usará sua localidade para escolher seu símbolo monetário. Javadoc de NumberFormat

Para definir o separador de milhar, digamos 123,456.78 você tem que 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 defina #,###.00 mask, ele formata com êxito os valores mais longos também. Observe que o separador de vírgula (,) no resultado depende da sua localidade. Pode ser apenas espaço () para localidade russa.

Outra maneira que poderia fazer sentido para a situação dada é

 BigDecimal newBD = oldBD.setScale(2); 

Eu só digo isso porque, em alguns casos, quando se trata de dinheiro indo além de duas casas decimais, não faz sentido. Levando isso um passo adiante, isso pode levar a

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

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

  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

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