Sformatuj BigDecimal jako ciąg z maksymalnie 2 cyframi dziesiętnymi, usuwając 0 z części dziesiętnej


80

Mam liczbę BigDecimal i biorę pod uwagę tylko 2 miejsca po przecinku, więc skracam ją za pomocą:

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

Teraz chcę wydrukować go jako ciąg, ale usuwając część dziesiętną, jeśli wynosi 0, na przykład:

1,00 -> 1

1,50 -> 1,5

1,99 -> 1,99

Próbowałem użyć programu Formatter, formatter.format, ale zawsze otrzymuję 2 cyfry dziesiętne.

Jak mogę to zrobić? Może pracujesz nad napisem z bd.toPlainString ()?

Odpowiedzi:


103

Użyłem DecimalFormat do formatowania BigDecimal zamiast formatowania ciągu, wydaje się, że nie ma z tym problemów.

Kod wygląda mniej więcej tak:

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);

Jakie są oczekiwane wyniki tego programu. Mam te same wymagania co do zer kończących po przecinku, ale zera kończące, takie jak .00, obcinane na wyjściu.
Paramesh Korrakuti

1
@ParameshKorrakuti df.setMinimumFractionDigits(2)działa dobrze bez setScale i setGrouping oraz setMaxFrac.
Andrew Grinder

4
Format dziesiętny to NumberFormat w przebraniu. Użyj NumberFormat numberFormat = NumberFormat.getPercentInstance();następnie numberFormat.setMinimumFractionDigits(2);następnieString percent = numberFormat.format(yourBigDecimal);
Andrew szlifierka

1
Java 9 i BigDecimal.ROUND_DOWNnowsze są przestarzałe. Użyj RoundingMode.DOWNzamiast tego.
Dilantha,

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

42
Używam, new DecimalFormat("0.00")jeśli chcę mieć pewność, że dwa miejsca dziesiętne są zawsze wyświetlane, np. 1000.5Wyświetli się jako 1000.50.
Chris Parton,

1
Rozwiązanie @ ChrisParton sprawdza się doskonale, dodatkowo jeśli ktoś wymaga zastosowania lokalizacji, możemy skorzystać z poniższej logiki. 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); } }
Paramesh Korrakuti

14

Poniższy kod może ci pomóc.

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);
}


3

Jeśli jego pieniądze, użyj:

NumberFormat.getNumberInstance(java.util.Locale.US).format(bd)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.