Как печатать форматированные значения BigDecimal?

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

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

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

Ответ 1

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

Он будет использовать текущие значения по умолчанию для ваших JVM Locale, чтобы выбрать символ валюты. Или вы можете указать Locale.

NumberFormat.getInstance(Locale.US)

Для получения дополнительной информации см. NumberFormat класс.

Ответ 2

Чтобы установить разделитель тысяч, скажем, 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, она успешно форматирует и более длинные значения. Обратите внимание, что разделитель запятой (,) в результате зависит от вашей локали. Это может быть просто пробел() для русской локали.

Ответ 3

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

BigDecimal newBD = oldBD.setScale(2);

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

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

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

Ответ 4

 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

Ответ 5

Аналогичен ответу @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

Ответ 6

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