Comment utiliser NumberFormat
pour formater une valeur double
pour une Locale
donnée (les paramètres régionaux par défaut sont suffisants) et pour un nombre donné de décimales?
Par exemple, j'ai ces valeurs:
double d1 = 123456.78;
double d2 = 567890;
Et je veux les imprimer de la manière suivante, par exemple avec les paramètres régionaux et américains à deux décimales:
123,456.78
567,890.00
Dans ce cas, le mode d’arrondi ne me tient pas à cœur, car ces valeurs doubles sont obtenues à partir de BigDecimal
avec l’échelle donnée; leur nombre de décimales est donc toujours inférieur ou égal au nombre de décimales que je veux imprimer.
Modifier:
Pour rendre les choses un peu plus claires, le fait est que je veux afficher de l'argent en fonction des paramètres régionaux, mais avec un nombre fixe de décimales. L'exemple ci-dessus montre comment les valeurs doivent être formatées si l'environnement local du système est en_US
. Maintenant, disons que les paramètres régionaux du système sont cs_CZ
(tchèque), les mêmes nombres doivent donc être formatés de la manière suivante:
123 456,78
567 890,00
Maintenant, comment puis-je configurer un NumberFormat pour toujours afficher 2 décimales, mais pour afficher le séparateur de milliers et le point décimal en fonction de la locale en cours?
Si vous souhaitez lire la documentation de NumberFormat, la solution serait évidente:
double d1 = 123456.78;
double d2 = 567890;
// self commenting issue, the code is easier to understand
Locale fmtLocale = Locale.getDefault(Category.FORMAT);
NumberFormat formatter = NumberFormat.getInstance(fmtLocale);
formatter.setMaximumFractionDigits(2);
formatter.setMinimumFractionDigits(2);
System.out.println(formatter.format(d1));
System.out.println(formatter.format(d2));
System.out.println(fmtLocale.toLanguageTag());
Sur ma machine, cela affiche:
123 456,78
567 890,00
pl-PL
Je crois que c'est ce que vous recherchez et vous n'avez pas à vous embrouiller avec les schémas. Je ne ferais pas cela - par exemple, il y a des locales qui regroupent les chiffres par deux et non par trois (c'est la raison pour laquelle nous parlons de séparateur de groupement et non séparateur de milliers ) .
Adapté de Personnalisation des formats ,
public void localizedFormat(double value,Locale loc ) {
NumberFormat nf = NumberFormat.getNumberInstance(loc);
DecimalFormat df = (DecimalFormat)nf;
df.applyPattern("###,###.00");
String output = df.format(value);
}
Cette fonction devrait vous donner le formatage requis.
Vous pourriez utiliser quelque chose comme
DecimalFormat formatter = (DecimalFormat) DecimalFormat.getInstance();
formatter.applyPattern("#,###,##0.00");
formatter.format(yourDoubleHere)
convertit une valeur double en une valeur double avec un nombre quelconque de chiffres après le signe décimal. J'ai créé cette méthode dans une classe Utility pour y accéder via le projet.
public static double convertToDecimal(double doubleValue, int numOfDecimals) {
BigDecimal bd = new BigDecimal(doubleValue);
bd = bd.setScale(numOfDecimals, BigDecimal.ROUND_HALF_UP);
return bd.doubleValue();
}