Comment formater des nombres en Java
Formatez des nombres Java avec String.format, printf, DecimalFormat et NumberFormat.
Java vous offre plusieurs moyens de transformer un int, un double ou un BigDecimal brut en une chaîne lisible par un humain : séparateurs de milliers, décimales fixes, symboles monétaires et pourcentages. Ce chapitre passe en revue les outils les plus utilisés : String.format/printf, DecimalFormat et le NumberFormat sensible aux paramètres régionaux. Pour les types numériques sous-jacents acceptés par ces méthodes, consultez Java Numbers ; pour la liste complète des conversions printf, consultez Java String Formatting.
Formatage rapide avec String.format et printf
Pour un formatage ponctuel dans une ligne de log ou avec System.out, l'approche par chaîne de format est la plus courte. printf affiche directement ; String.format retourne la chaîne pour que vous puissiez la stocker.
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 conversion %.2f fixe deux décimales, le drapeau virgule , ajoute des séparateurs de groupement, et %08.2f remplit le champ entier de zéros jusqu'à une largeur de 8. Utilisez %n plutôt que \n pour un saut de ligne compatible avec la plateforme. Le séparateur de groupement suit les paramètres régionaux par défaut, donc le même code peut afficher 1.234,50 sur une machine allemande.
Modèles personnalisés avec DecimalFormat
Quand vous avez besoin d'un contrôle total sur le motif, ou que vous souhaitez formater de nombreuses valeurs avec un objet réutilisable, utilisez DecimalFormat. Vous décrivez la sortie avec un motif composé de caractères # (chiffre optionnel) et 0 (chiffre obligatoire).
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 arrondit avec RoundingMode.HALF_EVEN par défaut, ce qui peut vous surprendre (2.5 s'arrondit à 2). Définissez df.setRoundingMode(RoundingMode.HALF_UP) si vous avez besoin du comportement habituel d'arrondi « à mi-chemin vers le haut ». Une seule instance de DecimalFormat n'est pas thread-safe, donc créez-en une par thread ou protégez-la.
Monnaie et pourcentage sensibles aux paramètres régionaux
Pour la monnaie et les pourcentages, ne construisez pas le motif à la main. Les méthodes de fabrique de NumberFormat choisissent le bon symbole, les bons séparateurs et le bon nombre de chiffres pour une 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%"Notez que le formateur de pourcentage multiplie par 100, donc vous passez 0.87 pour obtenir 87%. Passer la bonne Locale est ce qui rend la sortie correcte pour chaque marché.
| Approche | Idéal pour | Sensible aux paramètres régionaux | Réutilisable |
|---|---|---|---|
printf / String.format | sortie ponctuelle | oui (locale par défaut) | non |
DecimalFormat | motifs personnalisés, traitement en masse | oui (configurable) | oui (non thread-safe) |
NumberFormat.getCurrencyInstance | montants | oui | oui |
NumberFormat.getPercentInstance | ratios | oui | oui |
Un exemple complet et exécutable
Le programme ci-dessous formate le même nombre de quatre façons différentes, puis montre le remplissage par des zéros, afin que vous puissiez comparer les sorties côte à côte.
Ce qu'il faut retenir de l'exécution :
printfavec%,.2faffiche1,234,567.89, en ajoutant des séparateurs de groupement et en fixant deux décimales.DecimalFormat("#,##0.00")produit le même1,234,567.89mais en tant que chaîne réutilisable et retournable.getCurrencyInstance(Locale.US)ajoute le symbole$pour donner$1,234,567.89.getPercentInstancemultiplie0.8736par 100 et l'arrondit à87%.%08.2fremplit42.5de zéros jusqu'à une largeur de 8, affichant00042.50.