Zahlen in Java formatieren
Java-Zahlen mit String.format, printf, DecimalFormat und NumberFormat formatieren.
Java bietet mehrere Möglichkeiten, einen rohen int, double oder BigDecimal in eine benutzerfreundliche Zeichenkette umzuwandeln: Tausendertrennzeichen, feste Dezimalstellen, Währungssymbole und Prozentwerte. Dieses Kapitel behandelt die am häufigsten verwendeten Werkzeuge: String.format/printf, DecimalFormat und das gebietsschema-bewusste NumberFormat. Zu den zugrundeliegenden numerischen Typen, die diese Methoden akzeptieren, siehe Java Numbers; für die vollständige Liste der printf-Konvertierungen siehe Java String Formatting.
Schnelles Formatieren mit String.format und printf
Für einmalige Formatierungen in einer Logzeile oder mit System.out ist der Format-String-Ansatz der kürzeste Weg. printf gibt direkt aus; String.format gibt die Zeichenkette zurück, sodass Sie sie speichern können.
double price = 1234.5;
System.out.printf("%.2f%n", price); // 1234.50
String s = String.format("%,.2f", price); // 1,234.50
System.out.println(String.format("%08.2f", 42.5)); // 00042.50Die Konvertierung %.2f legt zwei Dezimalstellen fest, das Komma-Flag , fügt Gruppentrennzeichen hinzu, und %08.2f füllt das gesamte Feld mit Nullen auf Breite 8 auf. Verwenden Sie %n statt \n für einen plattformkorrekten Zeilenumbruch. Das Gruppentrennzeichen folgt dem Standard-Gebietsschema, daher kann derselbe Code auf einem deutschen Rechner 1.234,50 ausgeben.
Benutzerdefinierte Muster mit DecimalFormat
Wenn Sie die volle Kontrolle über das Muster benötigen oder viele Werte mit einem wiederverwendbaren Objekt formatieren möchten, verwenden Sie DecimalFormat. Sie beschreiben die Ausgabe mit einem Muster aus #- (optionale Stelle) und 0-Zeichen (erforderliche Stelle).
DecimalFormat df = new DecimalFormat("#,##0.00");
df.format(1234.5); // "1,234.50"
df.format(0.5); // "0.50"
DecimalFormat sci = new DecimalFormat("0.###E0");
sci.format(123456); // "1.235E5"DecimalFormat rundet standardmäßig mit RoundingMode.HALF_EVEN, was überraschend sein kann (2.5 wird zu 2 gerundet). Setzen Sie df.setRoundingMode(RoundingMode.HALF_UP), wenn Sie das alltägliche „halb aufrunden"-Verhalten benötigen. Eine einzelne DecimalFormat-Instanz ist nicht thread-sicher, erstellen Sie daher eine Instanz pro Thread oder sichern Sie sie ab.
Gebietsschema-bewusste Währung und Prozent
Für Währungen und Prozentwerte sollten Sie das Muster nicht von Hand erstellen. Die Factory-Methoden von NumberFormat wählen das richtige Symbol, die richtigen Trennzeichen und die richtige Stellenanzahl für ein Locale aus.
NumberFormat us = NumberFormat.getCurrencyInstance(Locale.US);
us.format(1234.5); // "$1,234.50"
NumberFormat pct = NumberFormat.getPercentInstance(Locale.US);
pct.format(0.87); // "87%"Beachten Sie, dass der Prozent-Formatierer mit 100 multipliziert, Sie übergeben also 0.87, um 87% zu erhalten. Das korrekte Locale zu übergeben sorgt dafür, dass die Ausgabe für jeden Markt stimmt.
| Ansatz | Am besten für | Gebietsschema-bewusst | Wiederverwendbar |
|---|---|---|---|
printf / String.format | einmalige Ausgabe | ja (Standard-Gebietsschema) | nein |
DecimalFormat | benutzerdefinierte Muster, Massendaten | ja (konfigurierbar) | ja (nicht thread-sicher) |
NumberFormat.getCurrencyInstance | Geldbeträge | ja | ja |
NumberFormat.getPercentInstance | Verhältnisse | ja | ja |
Ein vollständiges, ausführbares Beispiel
Das folgende Programm formatiert dieselbe Zahl auf vier verschiedene Arten und zeigt dann die Null-Auffüllung, sodass Sie die Ausgaben direkt vergleichen können.
Was aus der Ausführung zu entnehmen ist:
printfmit%,.2fgibt1,234,567.89aus und fügt Gruppentrennzeichen hinzu sowie zwei feste Dezimalstellen.DecimalFormat("#,##0.00")liefert dasselbe1,234,567.89, jedoch als wiederverwendbare, zurückgebbare Zeichenkette.getCurrencyInstance(Locale.US)stellt das$-Symbol voran und ergibt$1,234,567.89.getPercentInstancemultipliziert0.8736mit 100 und rundet auf87%.%08.2ffüllt42.5auf Breite 8 mit Nullen auf und gibt00042.50aus.