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 ()?

res1
źródło

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);
res1
źródło
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)
Federico Cattozzi
źródło
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);
}
Paramesh Korrakuti
źródło
12

Użyj stripTrailingZeros().

Ten artykuł powinien ci pomóc.

lrAndroid
źródło
3

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

NumberFormat.getNumberInstance(java.util.Locale.US).format(bd)
Heisenberg
źródło