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
%dpentru undoublesau%fpentru unint: programul se oprește cuIllegalFormatConversionException. - Dai mai puține argumente decât specificatori:
MissingFormatArgumentException. - Folosești
\nîn loc de%n. Merge, dar%npune 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.