0Pricing
Java Academy · Lektion

NumberFormat und printf

Formatieren Sie Zahlen für die Anzeige mit NumberFormat, DecimalFormat und printf-Mustern.

NumberFormat und printf ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

NumberFormat und printf

Java bietet leistungsfähige APIs zur Zahlenformatierung: NumberFormat für localeabhängige Währungs- und Prozentdarstellungen, DecimalFormat für benutzerdefinierte Muster sowie printf/String.format für Formatierungen im C-Stil.

Grundlagen von String.format

String.format() verwendet Formatbezeichner zum Erstellen von Strings. Häufige Bezeichner: %d (Ganzzahl), %f (Gleitkommazahl), %s (String), %n (Zeilenumbruch).

String name = "Alice";
int score = 95;
double avg = 87.567;

String msg = String.format(
    "Player: %s | Score: %d | Average: %.2f", name, score, avg);
System.out.println(msg);
// Player: Alice | Score: 95 | Average: 87.57

// printf is equivalent — formats directly to output
System.out.printf("%-10s %5d %8.2f%n", name, score, avg);
// Alice          95    87.57

Breite, Auffüllung und Ausrichtung

Formatbezeichner unterstützen Angaben für Breite und Ausrichtung: %10d (rechtsbündig in 10 Zeichen), %-10d (linksbündig), %010d (mit Nullen auffüllen).

// Table layout with padding
System.out.printf("%-20s %10s %10s%n", "Product", "Qty", "Price");
System.out.printf("%-20s %10d %10.2f%n", "Java Book", 3, 49.99);
System.out.printf("%-20s %10d %10.2f%n", "USB Hub", 1, 24.95);
System.out.printf("%-20s %10d %10.2f%n", "Mechanical Keyboard", 2, 129.00);

// Zero-padding for order IDs
int orderId = 42;
System.out.printf("Order: ORD-%08d%n", orderId); // Order: ORD-00000042

NumberFormat für Währungen

NumberFormat.getCurrencyInstance(Locale) formatiert Zahlen als Währungsstrings mit dem korrekten Symbol, den passenden Trennzeichen und der richtigen Anzahl an Dezimalstellen für ein bestimmtes Locale.

import java.text.*;
import java.util.*;

NumberFormat usd = NumberFormat.getCurrencyInstance(Locale.US);
NumberFormat eur = NumberFormat.getCurrencyInstance(Locale.GERMANY);
NumberFormat gbp = NumberFormat.getCurrencyInstance(Locale.UK);

double amount = 1234567.89;
System.out.println(usd.format(amount)); // $1,234,567.89
System.out.println(eur.format(amount)); // 1.234.567,89 EUR
System.out.println(gbp.format(amount)); // GBP1,234,567.89

NumberFormat für Prozentsätze

NumberFormat.getPercentInstance() formatiert eine Dezimalzahl als Prozentsatz. Übergeben Sie einen Wert zwischen 0 und 1.

import java.text.*;
import java.util.*;

NumberFormat pct = NumberFormat.getPercentInstance(Locale.US);
pct.setMaximumFractionDigits(1);

System.out.println(pct.format(0.75));     // 75%
System.out.println(pct.format(0.1234));   // 12.3%
System.out.println(pct.format(1.0));      // 100%

// Conversion rate in e-commerce
double convRate = 3_456.0 / 42_000.0;
System.out.println("Conversion: " + pct.format(convRate)); // 8.2%

DecimalFormat mit benutzerdefinierten Mustern

DecimalFormat verwendet eine Musterzeichenfolge, in der # für eine optionale Ziffer und 0 für eine obligatorische Ziffer steht.

import java.text.*;

DecimalFormat df1 = new DecimalFormat("#,###.00");
System.out.println(df1.format(1234567.5));  // 1,234,567.50

DecimalFormat df2 = new DecimalFormat("000.0");
System.out.println(df2.format(7.5));  // 007.5

DecimalFormat df3 = new DecimalFormat("0.00E0");
System.out.println(df3.format(0.000123)); // 1.23E-4

// Scientific notation for large values
DecimalFormat sci = new DecimalFormat("0.000E0");
System.out.println(sci.format(123456789)); // 1.235E8

Zahlen aus Strings parsen

NumberFormat kann localeformatierte Strings außerdem wieder in Zahlen parsen. Das ist unerlässlich, um Benutzereingaben in verschiedenen Locales zu verarbeiten.

import java.text.*;
import java.util.*;

NumberFormat nf = NumberFormat.getInstance(Locale.GERMANY);
try {
    // German uses comma as decimal separator
    Number parsed = nf.parse("1.234,56");
    System.out.println(parsed.doubleValue()); // 1234.56

    // Parse US currency string
    NumberFormat usd = NumberFormat.getCurrencyInstance(Locale.US);
    Number amount = usd.parse("$1,234.56");
    System.out.println(amount.doubleValue()); // 1234.56
} catch (ParseException e) {
    System.out.println("Parse error: " + e.getMessage());
}

Formatierte Strings (Java 15+)

Java 15+ ergänzt String.formatted() als alternative Instanzmethode zu String.format(), die sich für Methodenketten und Stream-Pipelines eignet.

record Product(String name, double price, int stock) {}

var products = List.of(
    new Product("Laptop", 999.0, 5),
    new Product("Mouse",  29.99, 42),
    new Product("Monitor", 349.0, 8)
);

products.stream()
    .map(p -> "%-15s $%8.2f  [stock: %d]"
        .formatted(p.name(), p.price(), p.stock()))
    .forEach(System.out::println);
// Laptop          $  999.00  [stock: 5]
// Mouse           $   29.99  [stock: 42]
// Monitor         $  349.00  [stock: 8]

Zahlengruppierung und Locale

Die Zahlengruppierung (Tausendertrennzeichen) variiert je nach Locale. Verwenden Sie für die Ausgabe an Benutzer immer NumberFormat, statt Kommas fest zu codieren.

import java.text.*;
import java.util.*;

long users = 1_234_567;

for (Locale locale : new Locale[]{Locale.US, Locale.FRANCE, Locale.GERMANY}) {
    NumberFormat nf = NumberFormat.getIntegerInstance(locale);
    System.out.printf("%-10s: %s%n", locale, nf.format(users));
}
// en_US     : 1,234,567
// fr_FR     : 1 234 567
// de_DE     : 1.234.567

Beispiel: Rechnungserstellung

Zusammenführung aller Elemente: Erstellen eines formatierten Rechnungsausdrucks mit korrekter Währungs- und Prozentdarstellung sowie ausgerichteten Tabellen.

import java.text.*;
import java.util.*;

NumberFormat curr = NumberFormat.getCurrencyInstance(Locale.US);
NumberFormat pct  = NumberFormat.getPercentInstance();
pct.setMaximumFractionDigits(0);

double subtotal = 1259.97;
double discount = 0.10;
double discountAmt = subtotal * discount;
double taxRate = 0.08;
double taxAmt = (subtotal - discountAmt) * taxRate;
double total = subtotal - discountAmt + taxAmt;

System.out.println("=== INVOICE ===");
System.out.printf("%-20s %15s%n", "Subtotal",       curr.format(subtotal));
System.out.printf("%-20s %15s%n", "Discount (" + pct.format(discount) + ")",
    "-" + curr.format(discountAmt));
System.out.printf("%-20s %15s%n", "Tax (" + pct.format(taxRate) + ")",
    curr.format(taxAmt));
System.out.printf("%-20s %15s%n", "TOTAL", curr.format(total));

Häufige Fallstricke

Beachten Sie diese häufigen Formatierungsfehler:

  • Die Verwendung von String.format mit einem falschen Typbezeichner (z. B. %d für ein double) führt zu einer IllegalFormatConversionException
  • Locale-spezifische Formatierer erzeugen auf verschiedenen Rechnern unterschiedliche Ausgaben
  • NumberFormat-Instanzen sind nicht threadsicher – erstellen Sie eine pro Thread oder verwenden Sie ThreadLocal
// Wrong specifier
try {
    String.format("%d", 3.14); // IllegalFormatConversionException
} catch (java.util.IllegalFormatConversionException e) {
    System.out.println("Wrong format specifier!");
}

// Thread-safe pattern using ThreadLocal
ThreadLocal<NumberFormat> localFmt = ThreadLocal
    .withInitial(() -> NumberFormat.getCurrencyInstance(Locale.US));
// each thread gets its own NumberFormat instance

Schnelltest

Welche Ausgabe erzeugt String.format("%08.2f", 3.5)?

Zusammenfassung: NumberFormat und printf

Wichtigste Erkenntnisse:

  • String.format / printf verwenden Formatbezeichner: %d, %f, %s, %.2f
  • Angaben für Breite und Ausrichtung: %10d (rechts), %-10d (links), %010d (mit Nullen auffüllen)
  • NumberFormat.getCurrencyInstance() für eine localeabhängige Währungsdarstellung
  • NumberFormat.getPercentInstance() für die Ausgabe von Prozentsätzen
  • DecimalFormat verwendet Ziffernmuster mit # (optional) und 0 (obligatorisch)
  • NumberFormat kann localeformatierte Strings auch wieder in Zahlen parsen

Häufig gestellte Fragen

Ist die Lektion „NumberFormat und printf“ kostenlos?

Ja — der vollständige Text von „NumberFormat und printf“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „NumberFormat und printf“?

Formatieren Sie Zahlen für die Anzeige mit NumberFormat, DecimalFormat und printf-Mustern. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Java Academy zu starten?

Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „NumberFormat und printf“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?

Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Grundlagen der Math-Klasse
  2. Ganzzahlarithmetik und Überlauf
  3. BigDecimal für Finanzberechnungen
  4. NumberFormat und printf
← Zurück zu Java Academy