Due modi per formattare
Java formatta le stringhe partendo da un template che contiene degli specificatori di formato (i segnaposto con %) più i valori da inserire. Ci sono due punti di accesso, con una sintassi identica:
String.format(template, values...)restituisce una nuovaString.System.out.printf(template, values...)stampa direttamente il risultato.
Entrambi producono lo stesso testo. String.format te lo restituisce così puoi salvarlo; printf lo scrive sulla console. Nota il %n alla fine del template di printf: è il ritorno a capo indipendente dalla piattaforma (preferiscilo a \n nelle stringhe di formato).
Gli specificatori più comuni
Ogni specificatore inizia con % e finisce con una lettera che indica che tipo di valore aspettarsi:
I tre di tutti i giorni sono %s (qualsiasi valore, tramite il suo toString), %d (numeri interi) e %f (numeri decimali). Usa %% per stampare un simbolo di percentuale letterale. Passare il tipo sbagliato, per esempio una String a %d, lancia una IllegalFormatConversionException a runtime.
Controllare le cifre decimali
%f usa per default sei cifre decimali, raramente ciò che vuoi. Metti .N prima della f per fissare la precisione (il valore viene arrotondato):
Aggiungi il flag virgola per avere i separatori di gruppo nei numeri grandi:
Larghezza e padding
Un numero tra il % e la lettera del tipo imposta una larghezza minima del campo, riempita con spazi così le colonne restano allineate. Un - iniziale allinea a sinistra; uno 0 iniziale riempie i numeri con degli zeri:
È questo che rende leggibili le tabelle formattate e i report allineati, soprattutto quando stampi ogni riga dentro un ciclo for:
%-8s allinea i nomi a sinistra in una colonna larga 8 e %5d allinea i punteggi a destra in una colonna larga 5, così i numeri restano allineati qualunque sia il numero di cifre.
Ordine degli argomenti
Per default gli specificatori usano i valori da sinistra a destra. Puoi ripetere o riordinare un valore con N$ (indice che parte da uno), comodo quando lo stesso valore compare due volte:
%1$s si riferisce entrambe le volte al primo argomento, quindi echo viene stampato due volte.
Il metodo formatted()
Da Java 15 ogni stringa ha un metodo di istanza formatted: è lo stesso motore di String.format, scritto però come chiamata di metodo sul template:
Si abbina particolarmente bene ai text block (stringhe su più righe tra tre virgolette) quando costruisci output formattati più lunghi.
Quando non usare String.format
Per semplici unioni occasionali, la normale concatenazione con + è più chiara e più veloce:
String greeting = "Hi, " + name + "!"; // simpler than String.format here
Usa String.format / printf quando ti serve una vera formattazione (decimali fissi, padding, allineamento, separatori di gruppo) e non solo per incollare un paio di valori.
Prossima pagina: operatori
La formattazione trasforma i valori in testo. Per calcolare quei valori ti servono prima gli operatori di Java: aritmetici, di confronto e logici. È l'argomento della prossima pagina.
Domande frequenti
Come si formatta una stringa in Java?
Usa String.format(template, values...), che restituisce una nuova stringa in cui ogni specificatore di formato è sostituito da un valore: String.format("%s is %d", name, age). Per stampare direttamente invece di costruire una stringa, usa System.out.printf(...) con lo stesso template. Da Java 15 puoi anche chiamare template.formatted(values...).
Come si formatta un numero con due decimali in Java?
Usa lo specificatore %.2f: String.format("%.2f", 3.14159) produce "3.14". Il numero dopo il punto indica quante cifre decimali tenere, e il valore viene arrotondato. Per i separatori delle migliaia aggiungi il flag virgola: %,.2f dà "1,234.57".
Che differenza c'è tra String.format e printf in Java?
Usano esattamente gli stessi specificatori di formato. String.format(...) restituisce il testo formattato come nuova String che puoi salvare o passare ad altri metodi. System.out.printf(...) scrive il testo formattato direttamente sull'output standard e non restituisce niente di utile. Usa String.format per costruire una stringa, printf per stamparla.