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?

res1
quelle

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);
res1
quelle
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)
Federico Cattozzi
quelle
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);
}
Paramesh Korrakuti
quelle
12

Verwenden Sie stripTrailingZeros().

Dieser Artikel soll Ihnen helfen.

lrAndroid
quelle
3

Wenn sein Geld verwendet:

NumberFormat.getNumberInstance(java.util.Locale.US).format(bd)
Heisenberg
quelle