W3docs

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.50

La 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.

ApproccioAdatto perSensibile alla localeRiutilizzabile
printf / String.formatoutput occasionalesì (locale predefinita)no
DecimalFormatpattern personalizzati, in bloccosì (configurabile)sì (non thread-safe)
NumberFormat.getCurrencyInstancedenaro
NumberFormat.getPercentInstancerapporti

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.

java— editable, runs on the server

Cosa osservare dall'esecuzione:

  • printf con %,.2f stampa 1,234,567.89, aggiungendo separatori di raggruppamento e fissando due decimali.
  • DecimalFormat("#,##0.00") produce lo stesso 1,234,567.89 ma come stringa riutilizzabile e restituibile.
  • getCurrencyInstance(Locale.US) antepone il simbolo $ per ottenere $1,234,567.89.
  • getPercentInstance moltiplica 0.8736 per 100 e lo arrotonda a 87%.
  • %08.2f riempie con zeri 42.5 fino alla larghezza 8, stampando 00042.50.

Esercitazione

Pratica
Quale chiamata formatta il double 0.87 come la stringa '87%'?
Quale chiamata formatta il double 0.87 come la stringa '87%'?
Was this page helpful?