Як друкувати відформатовані значення BigDecimal?


104

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

Як я можу це зробити?

(Єдине просте рішення , яке я бачу себе отримує floatValueвід BigDecimalа потім використовувати , NumberFormatщоб зробити дві цифри точності для дробової частини).

Відповіді:


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

Він використовуватиме поточний за замовчуванням JVM Localeдля вибору символу вашої валюти. Або ви можете вказати Locale.

NumberFormat.getInstance(Locale.US)

Для отримання додаткової інформації див. NumberFormatКлас.


Чи можна вказати шаблон так само, як це робить DecimalFormat?
Філіп Джозеффі

71

Щоб встановити тисячу роздільника, скажіть, що 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маску, вона також успішно формує більш довгі значення. Зверніть увагу, що роздільник кома (,) в результаті залежить від вашої локальної точки. Це може бути просто простір () для російської мови.


19
Якщо ви бажаєте, щоб нуль відображався як 0,00 (замість .00), скористайтеся схемою "#,##0.00".
Джонік

35

Ще один спосіб, який міг би мати сенс для даної ситуації - це

BigDecimal newBD = oldBD.setScale(2);

Я це просто кажу, тому що в деяких випадках, коли мова йде про гроші, що перевищують 2 знаки після коми, це не має сенсу. Зробивши цей крок далі, це може призвести до

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

але я просто хотів виділити метод setScale (який також може приймати аргумент другого режиму округлення, щоб контролювати обробку останнього десяткового знаку. У деяких ситуаціях Java змушує вас вказати цей метод округлення).


14
 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


6

Аналогічно відповіді від @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
BigDecimal(19.0001).setScale(2, BigDecimal.RoundingMode.DOWN)

1
Повинен бути BigDecimal (19.001) .setScale (2, BigDecimal.ROUND_HALF_UP) .toString ()
Jeff Tsay
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.