web-dev-qa-db-fra.com

Comment formater une valeur flottante avec le format de devise de l'appareil?

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

Par exemple en Europe, vous écririez:

1.000,95 €

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

1,000,95 $

Dans d'autres devises, 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 obtenir un format aussi exact que possible pour toutes les devises existantes?

49
Janusz

J'ai trouvé la solution. La classe NumberFormat possède 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 de l'appareil. 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));
76
Janusz

Par souci d'exhaustivité, supposons que vous souhaitiez afficher un prix dans les paramètres régionaux actuels du téléphone (marque décimale correcte et séparateur de milliers) mais avec la devise de votre choix.

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

result contiendrait alors ces valeurs:

  • CZK1,234,567.89 avec paramètres régionaux américains
  • 1 234 567,89 Kč avec les paramètres régionaux tchèques

Si vous souhaitez omettre la partie décimale des prix (indiquez $199 au lieu de $199.00) appelez ceci avant d'utiliser le formateur:

format.setMinimumFractionDigits(0);

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

69
Eugen Pechanec

Découvrez DecimalFormat .

Il a une variété de fonctionnalités conçues pour permettre d'analyser et de formater des nombres dans n'importe quel lieu, y compris la prise en charge des chiffres occidentaux, arabes ou indiens. Il prend également en charge différentes saveurs de nombres, y compris les entiers ("123"), les nombres à virgule fixe ("123.4"), la notation scientifique ("1.23E4"), les pourcentages ("12%"), et les montants en devise ("$ 123"). Toutes ces saveurs peuvent être facilement localisées.

3
user658042

pour obtenir les paramètres régionaux de l'appareil, 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;
        }

puis pour faire le format:

        double num = 1323.526;

        NumberFormat defaultFormat = NumberFormat.getCurrencyInstance(getCurrentLocale(getContext()));
        defaultFormat.format(num)
1
Milos Simic Simo