Formatage des nombres en Java

1. Vue d'ensemble

Dans ce didacticiel, nous examinerons différentes approches du formatage des nombres en Java et comment les implémenter.

2. Formatage des nombres de base au format String #

La méthode de format String # est très utile pour le formatage des nombres. La méthode prend deux arguments. Le premier argument décrit le modèle sur le nombre de décimales que nous voulons voir, et le deuxième argument est la valeur donnée:

double value = 4.2352989244d; assertThat(String.format("%.2f", value)).isEqualTo("4.24"); assertThat(String.format("%.3f", value)).isEqualTo("4.235");

3. Formatage décimal par arrondi

En Java, nous avons deux types primitifs qui représentent des nombres décimaux - float et decimal :

double myDouble = 7.8723d; float myFloat = 7.8723f;

Le nombre de décimales peut être différent en fonction des opérations effectuées. Dans la plupart des cas, nous ne nous intéressons qu'aux deux premières décimales. Jetons un coup d'œil à quelques façons de formater une décimale en arrondissant.

3.1. Utilisation de BigDecimal pour le formatage des nombres

La classe BigDecimal fournit des méthodes pour arrondir à un nombre spécifié de décimales. Créons une méthode d'assistance qui retournera un double, arrondi au nombre de places souhaité:

public static double withBigDecimal(double value, int places) { BigDecimal bigDecimal = new BigDecimal(value); bigDecimal = bigDecimal.setScale(places, RoundingMode.HALF_UP); return bigDecimal.doubleValue(); }

Nous commençons avec une nouvelle instance de BigDecimal avec notre valeur décimale d'origine. Ensuite, en définissant l'échelle, nous fournissons le nombre de décimales que nous voulons et comment nous voulons arrondir notre nombre . L'utilisation de cette méthode nous permet de formater facilement une valeur double :

double D = 4.2352989244d; assertThat(withBigDecimal(D, 2)).isEqualTo(4.24); assertThat(withBigDecimal(D, 3)).isEqualTo(4.235);

3.2. Utilisation de Math # round

Nous pouvons également profiter des méthodes statiques de la classe Math pour arrondir une valeur double à une décimale spécifiée. Dans ce cas, nous pouvons ajuster le nombre de décimales en multipliant puis en divisant par 10 ^ n . Vérifions notre méthode d'assistance:

public static double withMathRound(double value, int places) { double scale = Math.pow(10, places); return Math.round(value * scale) / scale; }
assertThat(withMathRound(D, 2)).isEqualTo(4.24); assertThat(withMathRound(D, 3)).isEqualTo(4.235);

Cependant, cette méthode n'est recommandée que dans des cas particuliers car parfois la sortie peut être arrondie différemment comme prévu avant son impression.

C'est parce que Math # round tronque la valeur . Voyons comment cela peut arriver:

System.out.println(withMathRound(1000.0d, 17)); // Gives: 92.23372036854776 !! System.out.println(withMathRound(260.775d, 2)); // Gives: 260.77 instead of expected 260.78 

Et donc, la méthode n'est répertoriée qu'à des fins d'apprentissage.

4. Formatage de différents types de nombres

Dans certains cas particuliers, nous souhaitons peut-être formater un nombre pour un type spécifique comme la devise, un grand entier ou un pourcentage.

4.1. Formatage de grands entiers avec des virgules

Chaque fois que nous avons un grand entier dans notre application, nous pouvons vouloir l'afficher avec des virgules, en utilisant DecimalFormat avec un modèle prédéfini:

public static String withLargeIntegers(double value) { DecimalFormat df = new DecimalFormat("###,###,###"); return df.format(value); } int value = 123456789; assertThat(withLargeIntegers(value)).isEqualTo("123,456,789");

4.2. Remplir un nombre

Dans certains cas, nous pouvons vouloir compléter un nombre avec des zéros pour une longueur spécifiée. Ici, nous pouvons utiliser la méthode de format String # , comme décrit précédemment:

public static String byPaddingZeros(int value, int paddingLength) { return String.format("%0" + paddingLength + "d", value); } int value = 1; assertThat(byPaddingOutZeros(value, 3)).isEqualTo("001");

4.3. Formatage de nombres avec deux zéros après la décimale

Pour pouvoir imprimer un nombre donné avec deux zéros après la virgule décimale, nous utiliserons une fois de plus la classe DecimalFormat avec un modèle prédéfini:

public static double withTwoDecimalPlaces(double value) { DecimalFormat df = new DecimalFormat("#.00"); return new Double(df.format(value)); } int value = 12; assertThat(withTwoDecimalPlaces(value)).isEqualTo(12.00);

Dans ce cas, nous avons créé un nouveau format avec un modèle spécifiant deux zéros après la virgule décimale .

4.4. Formatage et pourcentages

De temps en temps, nous pouvons avoir besoin d'afficher des pourcentages.

Dans ce cas, nous pouvons utiliser la méthode NumberFormat # getPercentInstance . Cette méthode nous permet de fournir un paramètre régional pour imprimer la valeur dans un format correct pour le pays que vous avez spécifié:

public static String forPercentages(double value, Locale locale) { NumberFormat nf = NumberFormat.getPercentInstance(locale); return nf.format(value); } double value = 25f / 100f; assertThat(forPercentages(value, new Locale("en", "US"))).isEqualTo("25%");

4.5. Formatage du numéro de devise

Un moyen courant de stocker des devises dans notre application consiste à utiliser BigDecimal . Et si nous voulons les afficher à l'utilisateur? Dans ce cas, nous pouvons utiliser la classe NumberFormat :

public static String currencyWithChosenLocalisation(double value, Locale locale) { NumberFormat nf = NumberFormat.getCurrencyInstance(locale); return nf.format(value); }

Nous obtenons l'instance de devise pour une locale donnée , puis appelons simplement la méthode de format avec la valeur. Le résultat est le nombre affiché comme devise pour le pays spécifié:

double value = 23_500; assertThat(currencyWithChosenLocalisation(value, new Locale("en", "US"))).isEqualTo("$23,500.00"); assertThat(currencyWithChosenLocalisation(value, new Locale("zh", "CN"))).isEqualTo("¥23,500.00"); assertThat(currencyWithChosenLocalisation(value, new Locale("pl", "PL"))).isEqualTo("23 500 zł");

5. Cas d'utilisation du formatage avancé

DecimalFormat est l'un des moyens les plus courants de formater un nombre décimal en Java. Semblable aux exemples précédents, nous écrirons une méthode d'assistance:

public static double withDecimalFormatLocal(double value) { DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance(Locale.getDefault()); return new Double(df.format(value)); }

Notre type de formatage obtiendra le paramètre par défaut pour une localisation donnée.

Le formatage décimal est géré différemment dans différents pays en utilisant leurs systèmes numériques. Par exemple, le caractère de regroupement (virgule aux États-Unis, mais espace ou point dans d'autres paramètres régionaux), la taille de regroupement (trois aux États-Unis et dans la plupart des paramètres régionaux, mais différent en Inde) ou le caractère décimal (point aux États-Unis, mais un virgule dans d'autres paramètres régionaux).

double D = 4.2352989244d; assertThat(withDecimalFormatLocal(D)).isEqualTo(4.235);

Nous pouvons également étendre cette fonctionnalité pour fournir des modèles spécifiques:

public static double withDecimalFormatPattern(double value, int places) { DecimalFormat df2 = new DecimalFormat("#,###,###,##0.00"); DecimalFormat df3 = new DecimalFormat("#,###,###,##0.000"); if (places == 2) return new Double(df2.format(value)); else if (places == 3) return new Double(df3.format(value)); else throw new IllegalArgumentException(); } assertThat(withDecimalFormatPattern(D, 2)).isEqualTo(4.24); assertThat(withDecimalFormatPattern(D, 3)).isEqualTo(4.235);

Ici, nous permettons à notre utilisateur de configurer DecimalFormat par modèle choisi en fonction du nombre d'espaces.

6. Conclusion

Dans cet article, nous avons brièvement décrit différentes méthodes de formatage des nombres en Java. Comme nous pouvons le voir, il n'y a pas une seule meilleure façon de procéder. De nombreuses approches pourraient être suivies car chacune d'elles a ses propres caractéristiques.

Comme toujours, le code de ces exemples est disponible à l'adresse over sur GitHub.