Formatieren Sie eine BigDecimal als Zeichenfolge mit maximal 2 Dezimalstellen, wobei Sie 0 im Dezimalteil entfernen


80

Ich habe eine BigDecimal-Zahl und betrachte nur 2 Dezimalstellen, also schneide ich sie ab mit:

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

Jetzt möchte ich es als String drucken, aber den Dezimalteil entfernen, wenn er 0 ist, zum Beispiel:

1,00 -> 1

1,50 -> 1,5

1,99 -> 1,99

Ich habe versucht, einen Formatierer, formatter.format, zu verwenden, aber ich bekomme immer die 2 Dezimalstellen.

Wie kann ich das machen? Vielleicht an der Zeichenfolge von bd.toPlainString () arbeiten?

Antworten:


102

Ich habe DecimalFormat zum Formatieren des BigDecimal verwendet, anstatt den String zu formatieren. Es scheint keine Probleme damit zu geben.

Der Code ist ungefähr so:

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

Was ist die erwartete Ausgabe für dieses Programm. Ich habe die gleichen Anforderungen an nachgestellte Nullen nach dem Dezimalpunkt, aber nachgestellte Nullen wie .00, die in der Ausgabe abgeschnitten werden.
Paramesh Korrakuti

1
@ParameshKorrakuti df.setMinimumFractionDigits(2)funktioniert ohne setScale und setGrouping sowie setMaxFrac einwandfrei.
Andrew Grinder

4
Das Dezimalformat ist das getarnte NumberFormat. Verwenden Sie NumberFormat numberFormat = NumberFormat.getPercentInstance();dann numberFormat.setMinimumFractionDigits(2);dannString percent = numberFormat.format(yourBigDecimal);
Andrew Grinder

1
Java 9 und höher BigDecimal.ROUND_DOWNist veraltet. Verwenden Sie RoundingMode.DOWNstattdessen.
Dilantha

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

41
Ich verwende, new DecimalFormat("0.00")wenn ich sicherstellen möchte, dass die beiden Dezimalstellen immer angezeigt werden, z . B. 1000.5wird angezeigt als 1000.50.
Chris Parton

1
Die Lösung von @ ChrisParton funktioniert einwandfrei. Wenn jemand eine Lokalisierung anwenden muss, können wir die folgende Logik verwenden. 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

Der folgende Code kann Ihnen helfen.

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

Wenn sein Geld verwendet:

NumberFormat.getNumberInstance(java.util.Locale.US).format(bd)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.