Как распечатать отформатированные значения BigDecimal? - PullRequest
89 голосов
/ 03 августа 2010

У меня есть поле BigDecimal amount, которое представляет деньги, и мне нужно распечатать его значение в браузере в формате, подобном $123.00, $15.50, $0.33.

Как я могу это сделать?

(Единственное простое решение, которое я вижу сам, это получить floatValue из BigDecimal и затем использовать NumberFormat для получения двузначной точности для дробной части).

Ответы [ 6 ]

115 голосов
/ 03 августа 2010
public static String currencyFormat(BigDecimal n) {
    return NumberFormat.getCurrencyInstance().format(n);
}

Он будет использовать вашу локаль, чтобы выбрать символ валюты. Javadoc NumberFormat

54 голосов
/ 21 июля 2015

Чтобы установить разделитель тысяч, скажем, 123,456.78, вы должны использовать 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)));

Вот результат:

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

Хотя я установил#,###.00 маска, она также успешно форматирует более длинные значения.Обратите внимание, что разделитель запятой (,) в результате зависит от вашей локали.Это может быть просто пробел () для русской локали.

33 голосов
/ 21 декабря 2011

Другой способ, который может иметь смысл для данной ситуации, -

BigDecimal newBD = oldBD.setScale(2);

Я просто говорю это, потому что в некоторых случаях , когда речь идет о деньгах, выходящих за пределы 2 десятичных знаков, не имеет смысла. Если сделать еще один шаг вперед, это может привести к

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

но я просто хотел выделить метод setScale (который также может принимать второй аргумент режима округления для управления обработкой этого последнего десятичного знака. В некоторых ситуациях Java заставляет вас указать этот метод округления).

9 голосов
/ 20 сентября 2017
 BigDecimal pi = new BigDecimal(3.14);
 BigDecimal pi4 = new BigDecimal(12.56);

 System.out.printf("%.2f",pi);

// печать 3.14

System.out.printf("%.0f",pi4);

// печатает 13

1 голос
/ 06 мая 2019

Аналогично ответу @Jeff_Alieffson, но не полагается на значение по умолчанию Locale:

Используйте DecimalFormatSymbols для явного языкового стандарта:

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

Или явных символов-разделителей:

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

Тогда:

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

Результат:

12 345.00
1 голос
/ 26 июня 2016
BigDecimal(19.0001).setScale(2, BigDecimal.RoundingMode.DOWN)
...