2012-04-22 21 views
56

Mam kilka BigDecimal i uważam tylko 2 miejsca dziesiętne z nim więc obciąć go za pomocą:Formatowanie BigDecimal jako String z max 2 cyfr po przecinku, usuwając 0 na części dziesiętnych

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

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

1.00 -> 1

1,50 -> 1,5

1.99 -> 1.99

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

Jak mogę to zrobić? Może pracujesz na łańcuchu od bd.toPlainString()?

Odpowiedz

71

Użyłem DecimalFormat do formatowania BigDecimal zamiast formatowania String, nie wydaje się z tym problemem.

Kod jest coś takiego:

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

Jaki jest oczekiwany wynik dla tego programu. Mam takie same wymagania do końcowych zer po kropce dziesiętnej, ale kończące się zera jak **. 00 ** obcięcie w danych wyjściowych. –

+1

@ParameshKorrakuti 'df.setMinimumFractionDigits (2)' działa poprawnie bez ustawień setScale i setGrouping i setMaxFrac. –

+3

Format dziesiętny to NumberFormat w przebraniu. Użyj 'NumberFormat numberFormat = NumberFormat.getPercentInstance();' następnie 'numberFormat.setMinimumFractionDigits (2);' następnie 'String percent = numberFormat.format (yourBigDecimal);' –

45
new DecimalFormat("#0.##").format(bd) 
+28

Używam 'new DecimalFormat (" 0.00 ")' jeśli chcę w celu zapewnienia, że ​​zawsze wyświetlane są dwa miejsca po przecinku, np '1000.5' wyświetli się jako' 1000.50'. –

+1

@ Rozwiązanie ChrisParton działa idealnie, poza tym, jeśli ktoś wymaga zastosowania lokalizacji, możemy użyć poniższej logiki. 'import java.math.BigDecimal; import java.text. *; publiczna klasa LocalizeExample { public static void main (String [] args) { BigDecimal bd = new BigDecimal ("123.10"); DecimalFormat decimalFormat = (DecimalFormat) NumberFormat.getNumberInstance (Locale.GERMAN); decimalFormat.applyPattern ("# 0,00"); Wynik ciągu = decimalFormat.format (bd); System.out.println (wynik); } } ' –

6

Poniższy kod może 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); 
} 
2

jeżeli jego stosowanie pieniądze:

NumberFormat.getNumberInstance(java.util.Locale.US).format(bd) 
Powiązane problemy