Відформатуйте BigDecimal як String із максимум 2 десятковими цифрами, видаливши 0 з десяткової частини


80

У мене є число BigDecimal, і я розглядаю лише 2 знаки після коми, тому я скорочую його за допомогою:

bd = bd.setScale(2, BigDecimal.ROUND_DOWN)

Тепер я хочу роздрукувати його як String, але видалити десяткову частину, якщо вона дорівнює 0, наприклад:

1,00 -> 1

1,50 -> 1,5

1,99 -> 1,99

Я спробував використовувати Formatter, formatter.format, але я завжди отримую 2 десяткові цифри.

Як я можу це зробити? Можливо, працює над рядком з bd.toPlainString ()?

Відповіді:


103

Я використовував DecimalFormat для форматування BigDecimal замість форматування рядка, схоже, з цим проблем немає.

Код приблизно такий:

bd = bd.setScale(2, BigDecimal.ROUND_DOWN);

DecimalFormat df = new DecimalFormat();

df.setMaximumFractionDigits(2);

df.setMinimumFractionDigits(0);

df.setGroupingUsed(false);

String result = df.format(bd);

Який очікуваний результат для цієї програми. Я отримав той же вимога до замикаючим нулях після десяткової pointbut завершується нулів як .00 усічення на виході.
Парамеш Корракуті

1
@ParameshKorrakuti df.setMinimumFractionDigits(2)чудово працює без setScale та setGrouping та setMaxFrac.
Andrew Grinder

4
Десятковий формат - це замаскований формат NumberFormat. Використовуйте NumberFormat numberFormat = NumberFormat.getPercentInstance();потім numberFormat.setMinimumFractionDigits(2);потімString percent = numberFormat.format(yourBigDecimal);
Ендрю Grinder

1
Java 9 і новіших BigDecimal.ROUND_DOWNверсій застаріла. Використовуйте RoundingMode.DOWNзамість цього.
Діланта

69
new DecimalFormat("#0.##").format(bd)

42
Я використовую, new DecimalFormat("0.00")якщо хочу переконатися, що два десяткові знаки завжди відображаються, наприклад 1000.5, відображатимуться як 1000.50.
Chris Parton,

1
Рішення @ ChrisParton працює ідеально, крім того, якщо комусь потрібно застосувати локалізацію, ми можемо скористатися наведеною нижче логікою. import java.math.BigDecimal; import java.text.*; public class LocalizeExample { public static void main(String[] args) { BigDecimal bd = new BigDecimal("123.10"); DecimalFormat decimalFormat = (DecimalFormat) NumberFormat.getNumberInstance(Locale.GERMAN); decimalFormat.applyPattern("#0.00"); String result = decimalFormat.format(bd); System.out.println(result); } }
Парамеш Корракуті

14

Наведений нижче код може вам допомогти.

protected String getLocalizedBigDecimalValue(BigDecimal input, Locale locale) {
    final NumberFormat numberFormat = NumberFormat.getNumberInstance(locale);
    numberFormat.setGroupingUsed(true);
    numberFormat.setMaximumFractionDigits(2);
    numberFormat.setMinimumFractionDigits(2);
    return numberFormat.format(input);
}


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.