Come formattare i numeri in Java
Formatta i numeri Java con String.format, printf, DecimalFormat e NumberFormat.
Java offre diversi modi per trasformare un int, double o BigDecimal grezzo in una stringa leggibile: separatori delle migliaia, decimali fissi, simboli di valuta e percentuali. Questo capitolo illustra gli strumenti più utilizzati: String.format/printf, DecimalFormat e il NumberFormat sensibile alle impostazioni locali. Per i tipi numerici sottostanti accettati da questi metodi, consulta Java Numbers; per il set completo di conversioni printf, consulta Java String Formatting.
Formattazione rapida con String.format e printf
Per una formattazione occasionale in una riga di log o con System.out, l'approccio con la stringa di formato è il più conciso. printf stampa direttamente; String.format restituisce la stringa in modo da poterla memorizzare.
double price = 1234.5;
System.out.printf("%.2f%n", price); // 1234.50
String s = String.format("%,.2f", price); // 1,234.50
System.out.println(String.format("%08.2f", 42.5)); // 00042.50La conversione %.2f fissa due decimali, il flag virgola , aggiunge i separatori di raggruppamento e %08.2f riempie con zeri l'intero campo fino alla larghezza 8. Usa %n invece di \n per un'interruzione di riga corretta sulla piattaforma. Il separatore di raggruppamento segue la locale predefinita, quindi lo stesso codice potrebbe stampare 1.234,50 su una macchina tedesca.
Pattern personalizzati con DecimalFormat
Quando hai bisogno di controllo completo sul pattern, o vuoi formattare molti valori con un unico oggetto riutilizzabile, usa DecimalFormat. Descrivi l'output con un pattern di caratteri # (cifra opzionale) e 0 (cifra obbligatoria).
DecimalFormat df = new DecimalFormat("#,##0.00");
df.format(1234.5); // "1,234.50"
df.format(0.5); // "0.50"
DecimalFormat sci = new DecimalFormat("0.###E0");
sci.format(123456); // "1.235E5"DecimalFormat arrotonda con RoundingMode.HALF_EVEN per impostazione predefinita, il che può sorprendere (2.5 diventa 2). Imposta df.setRoundingMode(RoundingMode.HALF_UP) se hai bisogno del comportamento comune di "arrotondamento per eccesso a metà". Una singola istanza di DecimalFormat non è thread-safe, quindi creane una per thread o proteggila.
Valuta e percentuale sensibili alla locale
Per valuta e percentuali, non costruire il pattern a mano. I metodi factory di NumberFormat scelgono il simbolo corretto, i separatori e il numero di cifre per una Locale.
NumberFormat us = NumberFormat.getCurrencyInstance(Locale.US);
us.format(1234.5); // "$1,234.50"
NumberFormat pct = NumberFormat.getPercentInstance(Locale.US);
pct.format(0.87); // "87%"Si noti che il formattatore percentuale moltiplica per 100, quindi si passa 0.87 per ottenere 87%. Passare la Locale corretta è ciò che rende l'output corretto per ogni mercato.
| Approccio | Adatto per | Sensibile alla locale | Riutilizzabile |
|---|---|---|---|
printf / String.format | output occasionale | sì (locale predefinita) | no |
DecimalFormat | pattern personalizzati, in blocco | sì (configurabile) | sì (non thread-safe) |
NumberFormat.getCurrencyInstance | denaro | sì | sì |
NumberFormat.getPercentInstance | rapporti | sì | sì |
Un esempio completo ed eseguibile
Il programma seguente formatta lo stesso numero in quattro modi diversi, poi mostra il riempimento con zeri, così puoi confrontare i risultati fianco a fianco.
Cosa osservare dall'esecuzione:
printfcon%,.2fstampa1,234,567.89, aggiungendo separatori di raggruppamento e fissando due decimali.DecimalFormat("#,##0.00")produce lo stesso1,234,567.89ma come stringa riutilizzabile e restituibile.getCurrencyInstance(Locale.US)antepone il simbolo$per ottenere$1,234,567.89.getPercentInstancemoltiplica0.8736per 100 e lo arrotonda a87%.%08.2friempie con zeri42.5fino alla larghezza 8, stampando00042.50.