W3docs

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

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

ApprocheIdéal pourSensible aux paramètres régionauxRéutilisable
printf / String.formatsortie ponctuelleoui (locale par défaut)non
DecimalFormatmotifs personnalisés, traitement en masseoui (configurable)oui (non thread-safe)
NumberFormat.getCurrencyInstancemontantsouioui
NumberFormat.getPercentInstanceratiosouioui

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.

java— editable, runs on the server

Ce qu'il faut retenir de l'exécution :

  • printf avec %,.2f affiche 1,234,567.89, en ajoutant des séparateurs de groupement et en fixant deux décimales.
  • DecimalFormat("#,##0.00") produit le même 1,234,567.89 mais en tant que chaîne réutilisable et retournable.
  • getCurrencyInstance(Locale.US) ajoute le symbole $ pour donner $1,234,567.89.
  • getPercentInstance multiplie 0.8736 par 100 et l'arrondit à 87%.
  • %08.2f remplit 42.5 de zéros jusqu'à une largeur de 8, affichant 00042.50.

Exercice

Pratique
Quel appel formate le double 0.87 en la chaîne '87%' ?
Quel appel formate le double 0.87 en la chaîne '87%' ?
Was this page helpful?