Java Academy · Lektion

NumberFormat och printf

Formatera tal för visning med hjälp av NumberFormat, DecimalFormat och printf-mönster.

Lektion 4 av 413 steg

NumberFormat och printf är en gratis lektion i Java Academy på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Java Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Java Academy innehåller totalt 4 lektioner.

NumberFormat och printf

Java tillhandahåller omfattande API:er för talformatering: NumberFormat för lokaliseringsanpassade valutor och procenttal, DecimalFormat för anpassade mönster samt printf/String.format för C-liknande formatering.

Grunderna i String.format

String.format() använder formatspecifikationer för att bygga strängar. Vanliga specifikationer är: %d (heltal), %f (flyttal), %s (sträng) och %n (radbrytning).

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

Bredd, utfyllnad och justering

Formatspecifikationer stöder bredd och justeringsflaggor: %10d (högerjustera på 10 tecken), %-10d (vänsterjustera) och %010d (fyll ut med nollor).

// 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 valutor

NumberFormat.getCurrencyInstance(Locale) formaterar tal som valutasträngar med rätt symbol, avgränsare och antal decimaler för en angiven lokal.

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 procenttal

NumberFormat.getPercentInstance() formaterar ett decimaltal som en procentsträng. Ange ett värde mellan 0 och 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 med anpassade mönster

DecimalFormat använder en mönstersträng där # betyder valfri siffra och 0 betyder obligatorisk siffra.

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

Tolka tal från strängar

NumberFormat kan också tolka lokaliseringsanpassade strängar tillbaka till tal. Det är viktigt när användarinmatning ska läsas i olika lokaler.

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());
}

Formaterade strängar (Java 15+)

Java 15+ lägger till String.formatted() som ett alternativ i form av en instansmetod till String.format(), vilket är användbart i metodkedjor och stream-pipelines.

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]

Siffergruppering och lokaler

Siffergruppering (tusentalsavgränsare) varierar mellan olika lokaler. Använd alltid NumberFormat för utdata som visas för användare i stället för att hårdkoda kommatecken.

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

Exempel: skapa en faktura

Så här kombineras delarna: generera en formaterad fakturautskrift med korrekt valuta, procent och tabelljustering.

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));

Vanliga fallgropar

Se upp för dessa vanliga formateringsmisstag:

  • Om String.format används med fel formatspecifikation för typen (till exempel %d för en double) kastas IllegalFormatConversionException
  • Lokaliseringsspecifika formaterare ger olika utdata på olika datorer
  • NumberFormat-instanser är inte trådsäkra – skapa en per tråd eller använd 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

Snabbkontroll

Vad ger String.format("%08.2f", 3.5) för resultat?

Sammanfattning: NumberFormat och printf

Viktiga slutsatser:

  • String.format och printf använder formatspecifikationer: %d, %f, %s, %.2f
  • Bredd- och justeringsflaggor: %10d (höger), %-10d (vänster), %010d (utfyllnad med nollor)
  • NumberFormat.getCurrencyInstance() för lokaliseringsanpassad valutavisning
  • NumberFormat.getPercentInstance() för procentutdata
  • DecimalFormat använder siffermönstren # (valfri) och 0 (obligatorisk)
  • NumberFormat kan också tolka lokaliseringsanpassade strängar tillbaka till tal
Gratis att börja

Lär dig Java med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
104
Lektioner
374

Vanliga frågor

Är lektionen ”NumberFormat och printf” gratis?

Ja – hela texten till ”NumberFormat och printf” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Java Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Java Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”NumberFormat och printf”?

Formatera tal för visning med hjälp av NumberFormat, DecimalFormat och printf-mönster. Ni övar på Java Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Java Academy?

Du behöver inga förkunskaper. Utbildningen i Java Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”NumberFormat och printf”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Java Academy-lektionen?

Ja. Varje Java Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Grunderna i klassen Math
  2. Heltalsaritmetik och spill
  3. BigDecimal för finansiella beräkningar
  4. NumberFormat och printf
← Tillbaka till Java Academy