PrintStream.printf în Java

Afișează text formatat după un șablon cu %s, %d, %.2f, %n: numere cu zecimale fixe, coloane aliniate.

Sintaxă
PrintStream printf(String format, Object... argumente)
PrintStream printf(Locale locale, String format, Object... argumente)

Ce face PrintStream.printf

printf primește un șablon și valorile de pus în el. Fiecare % din șablon este înlocuit, pe rând, cu un argument: %s text, %d număr întreg, %f număr zecimal, %c caracter, %b boolean, %n rând nou, %% semnul procent.

Între % și literă pui detalii: %.2f (două zecimale), %8.2f (lățime 8, aliniat la dreapta), %-10s (lățime 10, aliniat la stânga), %05d (completat cu zerouri), %,d (separator de mii).

Separatorul zecimal și cel de mii depind de setările de limbă (Locale). Pentru formatul românesc (1.234,50) dai locale-ul ca prim argument: printf(Locale.of("ro", "RO"), ...). Aceleași reguli se folosesc în String.format și "...".formatted(...).

Parametri

Parametru Descriere
locale Opțional: regulile de formatare ale unei limbi.
format Șablonul, cu specificatori %....
argumente Valorile, în ordinea specificatorilor.

Ce returnează

Același PrintStream, ca să poți înlănțui apeluri.

Exemple

Exemplul 1: Un tabel aliniat

public class Main {
    public static void main(String[] args) {
        String[] produse = {"pâine", "cașcaval", "apă"};
        double[] preturi = {4.5, 32.99, 2.25};
        int[] cantitati = {2, 1, 6};

        System.out.printf("%-10s %3s %9s%n", "Produs", "Buc", "Total");
        double suma = 0;
        for (int i = 0; i < produse.length; i++) {
            double total = preturi[i] * cantitati[i];
            suma += total;
            System.out.printf("%-10s %3d %9.2f%n", produse[i], cantitati[i], total);
        }
        System.out.printf("%-10s %13.2f lei%n", "TOTAL", suma);
    }
}

Rezultat

Produs     Buc     Total
pâine        2      9.00
cașcaval     1     32.99
apă          6     13.50
TOTAL              55.49 lei

Exemplul 2: Specificatori des folosiți

public class Main {
    public static void main(String[] args) {
        System.out.printf("Factura nr. %05d%n", 42);
        System.out.printf("Locuitori: %,d%n", 1_716_961);
        System.out.printf("Reducere: %d%%%n", 15);
        System.out.printf("Inițiala: %c, activ: %b%n", 'A', true);
        System.out.printf("Pi: %.3f | %10.1f |%n", Math.PI, Math.PI);
        System.out.printf("%s are %d ani și media %.2f%n", "Ana", 21, 9.456);
    }
}

Rezultat

Factura nr. 00042
Locuitori: 1,716,961
Reducere: 15%
Inițiala: A, activ: true
Pi: 3.142 |        3.1 |
Ana are 21 ani și media 9.46

Exemplul 3: Format românesc cu Locale

Aceleași valori, formatate după regulile engleze și apoi după cele românești: punctul și virgula își schimbă rolul.

import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        double salariu = 7543.5;
        System.out.printf(Locale.US, "%,.2f lei%n", salariu);
        System.out.printf(Locale.of("ro", "RO"), "%,.2f lei%n", salariu);
    }
}

Rezultat

7,543.50 lei
7.543,50 lei

Greșeli frecvente

  • Pui %d pentru un double sau %f pentru un int: programul se oprește cu IllegalFormatConversionException.
  • Dai mai puține argumente decât specificatori: MissingFormatArgumentException.
  • Folosești \n în loc de %n. Merge, dar %n pune separatorul potrivit sistemului.

Comenzi înrudite

  • PrintStream.println: println afișează o valoare și trece la rând nou; print o afișează și rămâne pe același rând.
  • String.format: Construiește un șir dintr-un șablon cu %s, %d, %.2f etc.; formatted() face același lucru pe șablon.
  • NumberFormat: Formatează numere după regulile unei limbi (1.234,5 în română, 1,234.5 în engleză); getInstance îl creează, format îl aplică.
  • Locale: Reprezintă o limbă și o țară (ro-RO, en-US); spune cum se formatează numere, bani, date și cum se compară textele.