Formatage numérique en Java avec la classe DecimalFormat

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.

Étiquettes: Java DecimalFormat Formatting Data-Types

Publié le 13 juillet à 18h03