56 votes

Comment formater une valeur flottante au format de la devise du périphérique ?

J'ai une application qui imprime une valeur monétaire calculée et je veux afficher cette valeur avec le format monétaire par défaut.

Par exemple, en Europe, vous écrirez :

1.000,95€

Aux États-Unis, je pense que vous écririez

1,000.95$

Dans d'autres monnaies, il y a plus ou moins de valeurs affichées pour la fraction décimale, aux États-Unis ce serait 2 mais au Japon ce serait 0.

Comment puis-je obtenir un format aussi exact que possible pour toutes les monnaies existantes ?

86voto

Eugen Pechanec Points 342

Par souci d'exhaustivité, supposons que vous souhaitiez afficher un prix dans la locale actuelle du téléphone (marque décimale et séparateur de milliers corrects) mais dans la devise de votre choix.

NumberFormat format = NumberFormat.getCurrencyInstance(Locale.getDefault());
format.setCurrency(Currency.getInstance("CZK"));
String result = format.format(1234567.89);

result détiendrait alors ces valeurs :

  • CZK1,234,567.89 avec les paramètres américains
  • 1 234 567,89 Kč avec la locale tchèque

Si vous voulez omettre la partie décimale pour les prix (afficher $199 au lieu de $199.00 ) l'appellent avant d'utiliser le formateur :

format.setMinimumFractionDigits(0);

Toutes les options sont énumérées dans NumberFormat docs .

80voto

Janusz Points 52607

J'ai trouvé la solution. La classe NumberFormat dispose d'une multitude de formateurs prédéfinis. Il en existe également un pour le formatage des valeurs monétaires.

Si vous utilisez la méthode statique getCurrencyInstance, la classe renverra un formateur pour la devise par défaut du périphérique. J'utilise le code suivant pour définir mon résultat :

NumberFormat format = NumberFormat.getCurrencyInstance();
((TextView) findViewById(R.id.text_result)).setText(format.format(result));

3voto

Vérifiez DecimalFormat .

Il dispose d'une variété de fonctionnalités conçues pour permettre l'analyse syntaxique et l'analyse de l'information. et de formater les nombres dans n'importe quelle locale, y compris le support de l'occidental, de l'arabe, ou indiens. Il prend également en charge différentes saveurs de nombres, notamment les nombres entiers ("123"), les nombres à virgule fixe ("123.4"), les nota scientifique ("1.23E4"), les pourcentages ("12%"), et les montants en devises ("$123"). Toutes ces saveurs peuvent être facilement localisées.

2voto

Milos Simic Simo Points 101

Pour obtenir la locale du dispositif, vous pouvez utiliser ceci :

@TargetApi(Build.VERSION_CODES.N)
    public static Locale getCurrentLocale(Context c) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return c.getResources().getConfiguration().getLocales().get(0);
        } else {
            //noinspection deprecation
            return c.getResources().getConfiguration().locale;
        }

et ensuite de faire le format :

        double num = 1323.526;

        NumberFormat defaultFormat = NumberFormat.getCurrencyInstance(getCurrentLocale(getContext()));
        defaultFormat.format(num)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X