NumberFormat et printf
Formatez les nombres pour l’affichage à l’aide de NumberFormat, DecimalFormat et des modèles printf.
NumberFormat et printf est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.
NumberFormat et printf
Java fournit de riches API de mise en forme des nombres : NumberFormat pour les devises et pourcentages adaptés aux paramètres régionaux, DecimalFormat pour les modèles personnalisés, et printf/String.format pour une mise en forme de style C.
Bases de String.format
String.format() utilise des spécificateurs de format pour construire des chaînes. Spécificateurs courants : %d (entier), %f (nombre à virgule flottante), %s (chaîne), %n (nouvelle ligne).
String name = "Alice";
int score = 95;
double avg = 87.567;
String msg = String.format(
"Player: %s | Score: %d | Average: %.2f", name, score, avg);
System.out.println(msg);
// Player: Alice | Score: 95 | Average: 87.57
// printf is equivalent — formats directly to output
System.out.printf("%-10s %5d %8.2f%n", name, score, avg);
// Alice 95 87.57Largeur, remplissage et alignement
Les spécificateurs de format prennent en charge les indicateurs de largeur et d'alignement : %10d (alignement à droite sur 10 caractères), %-10d (alignement à gauche), %010d (remplissage avec des zéros).
// Table layout with padding
System.out.printf("%-20s %10s %10s%n", "Product", "Qty", "Price");
System.out.printf("%-20s %10d %10.2f%n", "Java Book", 3, 49.99);
System.out.printf("%-20s %10d %10.2f%n", "USB Hub", 1, 24.95);
System.out.printf("%-20s %10d %10.2f%n", "Mechanical Keyboard", 2, 129.00);
// Zero-padding for order IDs
int orderId = 42;
System.out.printf("Order: ORD-%08d%n", orderId); // Order: ORD-00000042NumberFormat pour les devises
NumberFormat.getCurrencyInstance(Locale) met les nombres en forme comme des montants monétaires, avec le symbole, les séparateurs et le nombre de décimales adaptés aux paramètres régionaux indiqués.
import java.text.*;
import java.util.*;
NumberFormat usd = NumberFormat.getCurrencyInstance(Locale.US);
NumberFormat eur = NumberFormat.getCurrencyInstance(Locale.GERMANY);
NumberFormat gbp = NumberFormat.getCurrencyInstance(Locale.UK);
double amount = 1234567.89;
System.out.println(usd.format(amount)); // $1,234,567.89
System.out.println(eur.format(amount)); // 1.234.567,89 EUR
System.out.println(gbp.format(amount)); // GBP1,234,567.89NumberFormat pour les pourcentages
NumberFormat.getPercentInstance() met un nombre décimal en forme comme un pourcentage. Transmettez-lui une valeur comprise entre 0 et 1.
import java.text.*;
import java.util.*;
NumberFormat pct = NumberFormat.getPercentInstance(Locale.US);
pct.setMaximumFractionDigits(1);
System.out.println(pct.format(0.75)); // 75%
System.out.println(pct.format(0.1234)); // 12.3%
System.out.println(pct.format(1.0)); // 100%
// Conversion rate in e-commerce
double convRate = 3_456.0 / 42_000.0;
System.out.println("Conversion: " + pct.format(convRate)); // 8.2%DecimalFormat avec des modèles personnalisés
DecimalFormat utilise une chaîne de modèle dans laquelle # représente un chiffre facultatif et 0 un chiffre obligatoire.
import java.text.*;
DecimalFormat df1 = new DecimalFormat("#,###.00");
System.out.println(df1.format(1234567.5)); // 1,234,567.50
DecimalFormat df2 = new DecimalFormat("000.0");
System.out.println(df2.format(7.5)); // 007.5
DecimalFormat df3 = new DecimalFormat("0.00E0");
System.out.println(df3.format(0.000123)); // 1.23E-4
// Scientific notation for large values
DecimalFormat sci = new DecimalFormat("0.000E0");
System.out.println(sci.format(123456789)); // 1.235E8Analyser des nombres à partir de chaînes
NumberFormat peut également analyser des chaînes mises en forme selon les paramètres régionaux pour les reconvertir en nombres. C'est essentiel pour lire les entrées des utilisateurs dans différents paramètres régionaux.
import java.text.*;
import java.util.*;
NumberFormat nf = NumberFormat.getInstance(Locale.GERMANY);
try {
// German uses comma as decimal separator
Number parsed = nf.parse("1.234,56");
System.out.println(parsed.doubleValue()); // 1234.56
// Parse US currency string
NumberFormat usd = NumberFormat.getCurrencyInstance(Locale.US);
Number amount = usd.parse("$1,234.56");
System.out.println(amount.doubleValue()); // 1234.56
} catch (ParseException e) {
System.out.println("Parse error: " + e.getMessage());
}Chaînes mises en forme (Java 15+)
Java 15+ ajoute String.formatted() comme solution de remplacement sous forme de méthode d'instance pour String.format(), particulièrement utile dans les chaînes d'appels de méthodes et les pipelines de flux.
record Product(String name, double price, int stock) {}
var products = List.of(
new Product("Laptop", 999.0, 5),
new Product("Mouse", 29.99, 42),
new Product("Monitor", 349.0, 8)
);
products.stream()
.map(p -> "%-15s $%8.2f [stock: %d]"
.formatted(p.name(), p.price(), p.stock()))
.forEach(System.out::println);
// Laptop $ 999.00 [stock: 5]
// Mouse $ 29.99 [stock: 42]
// Monitor $ 349.00 [stock: 8]Regroupement des nombres et paramètres régionaux
Le regroupement des chiffres (séparateur des milliers) varie selon les paramètres régionaux. Utilisez toujours NumberFormat pour les résultats destinés aux utilisateurs plutôt que de coder des virgules en dur.
import java.text.*;
import java.util.*;
long users = 1_234_567;
for (Locale locale : new Locale[]{Locale.US, Locale.FRANCE, Locale.GERMANY}) {
NumberFormat nf = NumberFormat.getIntegerInstance(locale);
System.out.printf("%-10s: %s%n", locale, nf.format(users));
}
// en_US : 1,234,567
// fr_FR : 1 234 567
// de_DE : 1.234.567Exemple de génération de facture
Assemblage de tous les éléments : génération d'une facture imprimée et mise en forme avec la devise, le pourcentage et l'alignement correct du tableau.
import java.text.*;
import java.util.*;
NumberFormat curr = NumberFormat.getCurrencyInstance(Locale.US);
NumberFormat pct = NumberFormat.getPercentInstance();
pct.setMaximumFractionDigits(0);
double subtotal = 1259.97;
double discount = 0.10;
double discountAmt = subtotal * discount;
double taxRate = 0.08;
double taxAmt = (subtotal - discountAmt) * taxRate;
double total = subtotal - discountAmt + taxAmt;
System.out.println("=== INVOICE ===");
System.out.printf("%-20s %15s%n", "Subtotal", curr.format(subtotal));
System.out.printf("%-20s %15s%n", "Discount (" + pct.format(discount) + ")",
"-" + curr.format(discountAmt));
System.out.printf("%-20s %15s%n", "Tax (" + pct.format(taxRate) + ")",
curr.format(taxAmt));
System.out.printf("%-20s %15s%n", "TOTAL", curr.format(total));Pièges courants
Faites attention aux erreurs courantes de mise en forme suivantes :
- Utiliser
String.formatavec un spécificateur de type incorrect (par exemple%dpour undouble) déclenche uneIllegalFormatConversionException - Les formateurs propres aux paramètres régionaux produisent des résultats différents selon les machines
- Les instances de NumberFormat ne sont pas sûres pour une utilisation concurrente : créez-en une par thread ou utilisez
ThreadLocal
// Wrong specifier
try {
String.format("%d", 3.14); // IllegalFormatConversionException
} catch (java.util.IllegalFormatConversionException e) {
System.out.println("Wrong format specifier!");
}
// Thread-safe pattern using ThreadLocal
ThreadLocal<NumberFormat> localFmt = ThreadLocal
.withInitial(() -> NumberFormat.getCurrencyInstance(Locale.US));
// each thread gets its own NumberFormat instanceVérification rapide
Que produit String.format("%08.2f", 3.5) ?
Récapitulatif : NumberFormat et printf
Points essentiels :
- String.format / printf utilisent des spécificateurs de format : %d, %f, %s, %.2f
- Indicateurs de largeur et d'alignement : %10d (à droite), %-10d (à gauche), %010d (remplissage avec des zéros)
- NumberFormat.getCurrencyInstance() pour afficher les devises selon les paramètres régionaux
- NumberFormat.getPercentInstance() pour afficher les pourcentages
- DecimalFormat utilise les modèles de chiffres # (facultatif) et 0 (obligatoire)
- NumberFormat peut également analyser les chaînes mises en forme selon les paramètres régionaux pour les reconvertir en nombres
Questions Fréquemment Posées
La leçon « NumberFormat et printf » est-elle gratuite ?
Oui — le texte complet de « NumberFormat et printf » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « NumberFormat et printf » ?
Formatez les nombres pour l’affichage à l’aide de NumberFormat, DecimalFormat et des modèles printf. Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Java Academy ?
Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « NumberFormat et printf » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?
Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Les notions essentielles de la classe Math
- Arithmétique entière et dépassement de capacité
- BigDecimal pour les calculs financiers
- NumberFormat et printf