String.format în Java

Construiește un șir dintr-un șablon cu %s, %d, %.2f etc.; formatted() face același lucru pe șablon.

Sintaxă
static String format(String format, Object... args)
static String format(Locale l, String format, Object... args)
String formatted(Object... args)   // Java 15

Ce face String.format

String.format(șablon, valori...) returnează un text în care fiecare specificator care începe cu % este înlocuit cu următoarea valoare. Cei mai folosiți: %s (text, orice obiect), %d (întreg), %f / %.2f (număr real, cu 2 zecimale), %c (caracter), %b (boolean), %x (hexazecimal), %n (rând nou), %% (semnul procent).

Între % și literă poți da lățimea: %5d (aliniat la dreapta pe 5 poziții), %-10s (la stânga pe 10), %05d (completat cu zerouri), %,d (separator de mii). "șablon".formatted(valori) (Java 15) face exact același lucru, dar se apelează pe șablon.

Formatarea numerelor depinde de Locale: fără argument se folosește limba implicită a sistemului (aici engleză, cu punct zecimal). Cu Locale.of("ro", "RO") obții virgulă zecimală și punct pentru mii. System.out.printf folosește aceleași reguli, dar afișează direct.

Parametri

Parametru Descriere
l Opțional: regulile regionale pentru numere și date.
format Șablonul cu specificatori %….
args Valorile, în ordinea specificatorilor.

Ce returnează

Textul formatat. Un specificator nepotrivit cu tipul valorii aruncă IllegalFormatException.

Exemple

Exemplul 1: Specificatorii de bază

public class Main {
    public static void main(String[] args) {
        String nume = "Ana";
        int varsta = 21;
        double media = 9.456;
        System.out.println(String.format("%s are %d de ani.", nume, varsta));
        System.out.println(String.format("Media: %.2f", media));
        System.out.println(String.format("Nota %d din %d (%d%%)", 9, 10, 90));
        System.out.println(String.format("Cod: %05d, hexa: %x, bool: %b", 42, 255, true));
        System.out.println("%s locuiește în %s.".formatted(nume, "Iași"));
    }
}

Rezultat

Ana are 21 de ani.
Media: 9.46
Nota 9 din 10 (90%)
Cod: 00042, hexa: ff, bool: true
Ana locuiește în Iași.

Exemplul 2: Tabel aliniat

%-10s aliniază numele la stânga pe 10 caractere, %8.2f prețul la dreapta pe 8.

public class Main {
    public static void main(String[] args) {
        String[] produse = {"Pâine", "Lapte", "Cașcaval"};
        double[] preturi = {4.5, 7.99, 32.0};
        for (int i = 0; i < produse.length; i++) {
            System.out.println(String.format("%-10s %8.2f lei", produse[i], preturi[i]));
        }
        System.out.printf("%-10s %8.2f lei%n", "Total", 44.49);
    }
}

Rezultat

Pâine          4.50 lei
Lapte          7.99 lei
Cașcaval      32.00 lei
Total         44.49 lei

Exemplul 3: Formatare românească

import java.util.Locale;

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

Rezultat

7,543.50 lei
7.543,50 lei
290.422 locuitori

Greșeli frecvente

  • Folosești %d pentru un double: primești IllegalFormatConversionException. Pentru numere cu zecimale folosește %f sau %.2f.
  • Scrii \n în șablon; merge, dar %n pune terminația corectă de rând pentru sistemul pe care rulează programul.
  • Uiți că rezultatul depinde de limba sistemului: pe un calculator setat în română, %.2f afișează virgulă. Dacă rezultatul este citit de un program, dă explicit Locale.ROOT.

Comenzi înrudite

  • String.valueOf: Transformă orice valoare (număr, boolean, char, obiect, char[]) în String; copyValueOf face un șir dintr-un char[].
  • String.repeat: Returnează șirul repetat de count ori, lipit; util pentru linii, chenare și alinieri.
  • Integer.toString: Transformă un număr întreg în text, în baza 10 sau în orice bază între 2 și 36.