W3docs

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.50

Die 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.

AnsatzAm besten fürGebietsschema-bewusstWiederverwendbar
printf / String.formateinmalige Ausgabeja (Standard-Gebietsschema)nein
DecimalFormatbenutzerdefinierte Muster, Massendatenja (konfigurierbar)ja (nicht thread-sicher)
NumberFormat.getCurrencyInstanceGeldbeträgejaja
NumberFormat.getPercentInstanceVerhältnissejaja

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.

java— editable, runs on the server

Was aus der Ausführung zu entnehmen ist:

  • printf mit %,.2f gibt 1,234,567.89 aus und fügt Gruppentrennzeichen hinzu sowie zwei feste Dezimalstellen.
  • DecimalFormat("#,##0.00") liefert dasselbe 1,234,567.89, jedoch als wiederverwendbare, zurückgebbare Zeichenkette.
  • getCurrencyInstance(Locale.US) stellt das $-Symbol voran und ergibt $1,234,567.89.
  • getPercentInstance multipliziert 0.8736 mit 100 und rundet auf 87%.
  • %08.2f füllt 42.5 auf Breite 8 mit Nullen auf und gibt 00042.50 aus.

Übungen

Übung
Welcher Aufruf formatiert den double-Wert 0.87 als Zeichenkette '87%'?
Welcher Aufruf formatiert den double-Wert 0.87 als Zeichenkette '87%'?
Was this page helpful?