La manipulation des nombres en Java nécessite souvent une mise en forme spécifique pour répondre à des contraintes métier : affichage de prix avec symboles monétaires, ajout de zéros de remplissage pour des identifiants, ou encore conversion en pourcentages. La classe java.text.DecimalFormat est l'outil privilégié pour ces transformations.
Initialisation du formateur
Il existe deux approches principales pour instancier un objet DecimalFormat et lui assigner un motif (pattern) :
// Approche 1 : Définition directe lors de la construction
DecimalFormat df1 = new DecimalFormat("###,###.00");
// Approche 2 : Modification dynamique du motif
DecimalFormat df2 = new DecimalFormat();
df2.applyPattern("000.##");
Une fois l'objet configuré, la méthode format(double value) retourne une chaîne de caractères formatée.
Syntaxe des motifs (Patterns)
Le comportement du formateur dépend des symboles utilisés dans la chaîne de caractères du motif :
0: Représente un chiffre obligatoire. Si le chiffre est absent, un 0 est affiché.#: Représente un chiffre optionnel. Si le chiffre est absent, rien n'est affiché..: Séparateur décimal.,: Séparateur de groupement (ex: milliers).-: Préfixe pour les nombres négatifs.%: Multiplie la valeur par 100 et ajoute le symbole de pourcentage.\u2030: Multiplie la valeur par 1000 et ajoute le symbole "pour mile".\u00A4: Symbole monétaire local (devise).': Utilisé pour échapper des caractères spéciaux et les afficher tels quels.
Exemples pratiques de formatage
Le code suivant illustre l'application de différents masques sur des valeurs numériques :
import java.text.DecimalFormat;
public class DemoFormatage {
public static void afficherResultat(String masque, double valeur) {
DecimalFormat formateur = new DecimalFormat(masque);
System.out.println("Masque [" + masque + "] -> " + formateur.format(valeur));
}
public static void main(String[] args) {
// Groupement et précision
afficherResultat("#,###.###", 987654.321); // 987 654,321
// Remplissage avec des zéros
afficherResultat("000000.00", 123.4); // 000123,40
// Unités personnalisées
afficherResultat("###.##kg", 55.789); // 55,79kg
// Pourcentage et arrondi
afficherResultat("#.#%", 0.8567); // 85,7%
// Monétaire
afficherResultat("#.##\u00A4", 1500.5); // 1500,50€
}
}
Gestion du groupement des chiffres
Au-delà des motifs texutels, DecimalFormat permet de contrôler programmatiquement la manière dont les nombres sont segmentés (généralement par groupes de trois pour les milliers).
public static void testerGroupage(double montant) {
DecimalFormat df = new DecimalFormat();
// Configuration du groupage
df.setGroupingSize(3); // Taille du segment
df.setGroupingUsed(true); // Activer le groupement
System.out.println("Avec groupage : " + df.format(montant));
df.setGroupingUsed(false); // Désactiver le groupement
System.out.println("Sans groupage : " + df.format(montant));
}
En utilisant setGroupingUsed(false), tous les séparateurs de miliers définis précédemment ou via un motif (comme la virgule dans le système anglo-saxon) seront ignorés lors du rendu final.