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.