1. Il problema della concatenazione manuale
Se bisogna stampare una o due variabili, l’operatore + è davvero comodo. Ma quando i dati sono molti, la concatenazione diventa rapidamente caotica, soprattutto se serve la formattazione dei numeri (per esempio, 2 cifre decimali) o gli a-capo.
String name = "Oleg";
int age = 25;
double balance = 12345.67;
System.out.println("Nome: " + name + ", età: " + age + ", saldo: " + balance + " euro.");
Il tentativo di «aggiustare» la formattazione all’interno della concatenazione peggiora solo la leggibilità:
System.out.println("Nome: " + name + ", età: " + age + ", saldo: " + String.format("%.2f", balance) + " euro.");
Conclusione: la concatenazione semplice va bene per le piccole cose, ma per messaggi complessi serve uno strumento più potente — String.format().
2. String.format — formattiamo le stringhe in modo professionale
Il metodo String.format() permette di creare una stringa a partire da un modello e sostituire i valori nelle posizioni indicate.
Forma generale:
String result = String.format("Modello", znacheniya);
- %s — stringa
- %d — intero
- %f — numero in virgola mobile
- %n — a-capo (multipiattaforma)
String name = "Oleg";
int age = 25;
double balance = 12345.6789;
String info = String.format("Nome: %s, età: %d, saldo: %.2f euro.", name, age, balance);
System.out.println(info);
// Stamperà: Nome: Oleg, età: 25, saldo: 12345.68 euro.
String result = String.format("Nome: %s, età: %d, saldo: %.2f euro", name, age, balance);
// %s — stringa, %d — intero, %.2f — numero con 2 cifre decimali
Formattazione di numeri e stringhe
Numeri in virgola mobile con precisione fissa:
double price = 99.999;
System.out.println(String.format("Prezzo: %.2f euro.", price)); // Prezzo: 100.00 euro.
Larghezza del campo e allineamento:
int n = 7;
System.out.println(String.format("Numero: [%5d]", n)); // Numero: [ 7]
System.out.println(String.format("Numero: [%-5d]", n)); // Numero: [7 ]
[5d] — larghezza del campo 5, allineamento a destra di default;
[-5d] — larghezza del campo 5, allineamento a sinistra.
Stringhe con allineamento:
String text = "Java";
System.out.println(String.format("[%10s]", text)); // [ Java]
System.out.println(String.format("[%-10s]", text)); // [Java ]
Percentuali:
double percent = 0.125;
System.out.println(String.format("Fatto: %.1f%%", percent * 100)); // Fatto: 12.5%
Per stampare il simbolo di percentuale, usa %%.
Formattazione delle date (in breve)
import java.util.Date;
Date now = new Date();
System.out.println(String.format("Oggi: %tD", now)); // Oggi: 06/18/24
System.out.println(String.format("Ora: %tT", now)); // Ora: 15:42:07
Localizzazione e separatori
Per impostazione predefinita viene usata la locale del sistema. Per impostarne una propria (ad esempio, la virgola come separatore dei decimali), passa una locale — per esempio, Locale.FRANCE.
import java.util.Locale;
double price = 1234.56;
System.out.println(String.format(Locale.FRANCE, "%.2f", price)); // 1234,56
Esempi pratici
Esempio 1: Report breve
String name = "Anna";
int tasks = 5;
double hours = 12.3456;
String report = String.format(
"Dipendente: %s%nAttività completate: %d%nOre impiegate: %.1f",
name, tasks, hours
);
System.out.println(report);
/* Output:
Dipendente: Anna
Attività completate: 5
Ore impiegate: 12.3
*/
Esempio 2: Tabella con allineamento
String header = String.format("%-10s | %5s | %8s", "Nome", "Punti", "Tempo");
String row1 = String.format("%-10s | %5d | %8.2f", "Oleg", 95, 10.5);
String row2 = String.format("%-10s | %5d | %8.2f", "Anna", 100, 9.75);
System.out.println(header);
System.out.println(row1);
System.out.println(row2);
/* Output:
Nome | Punti | Tempo
Oleg | 95 | 10.50
Anna | 100 | 9.75
*/
Esempio 3: Testo misto
int apples = 12;
int pears = 8;
System.out.println(String.format("Ho %d mele e %d pere.", apples, pears));
3. Pratica: formattazione delle stringhe nella nostra applicazione
Aggiungiamo la formattazione a un’applicazione da console: saldo sempre con due cifre decimali, a-capo tramite %n.
Scanner console = new Scanner(System.in);
System.out.print("Inserisci il nome: ");
String name = console.nextLine();
System.out.print("Inserisci l'età: ");
int age = console.nextInt();
System.out.print("Inserisci il saldo: ");
double balance = console.nextDouble();
// Output formattato
String info = String.format("Nome: %s, età: %d, saldo: %.2f euro.", name, age, balance);
System.out.println(info);
Provate:
- Inserire valori diversi e verificare che il saldo venga sempre stampato con due cifre decimali (%.2f).
- Modificare il modello per aggiungere gli a-capo usando %n.
4. Errori tipici nella formattazione delle stringhe
Errore n. 1: mancata corrispondenza tra tipi e specificatori.
Non si può sostituire una stringa in %d o un numero in %s.
String.format("Età: %d", "venti"); // Errore: ci si aspettava un numero, è stata passata una stringa
Errore n. 2: ordine degli argomenti invertito.
Nel modello %s %d, se si passa prima un numero e poi una stringa, si otterrà un errore o un output errato.
Errore n. 3: ignorare la locale.
Se ci si aspetta la virgola come separatore decimale ma si vede il punto, specificare esplicitamente la locale come primo parametro di String.format(...).
Errore n. 4: simbolo di percentuale non escapato.
Per stampare il simbolo %, usare %%, altrimenti la formattazione fallirà con un errore.
GO TO FULL VERSION