Formatage des devises dans les devises étrangères en Java

je fais de mon mieux pour trouver un moyen de formater des devises étrangères à travers différentes locales qui ne sont pas par défaut pour cette devise, en utilisant Java. J'ai trouvé java.util.Monnaie, qui peut représenter le symbole approprié à utiliser pour diverses locales. C'est-à-dire, pour L'USD, Il me fournit le symbole $ aux États-Unis, et US$ ou USD dans d'autres pays. J'ai aussi trouvé java.texte.NumberFormat, qui formatera une monnaie pour une locale spécifique. Mon problème-util.La monnaie fournira les symboles et les codes appropriés pour représenter les monnaies dans leurs locales non-default, mais ne formatera pas la monnaie d'une manière spécifique aux locales. NumberFormat suppose que le nombre que je passe, avec une locale, est la monnaie de paramètres régionaux, pas une monnaie étrangère.

par exemple, si j'utilise getCurrencyInstance (Locale.Allemagne) et ensuite le format (1000) il suppose que je formate 1000 euros. En réalité, je pourrais avoir besoin de la représentation correcte allemande-localisée (décimale correcte et des milliers de séparateur, si de mettre le symbole avant ou après le montant) pour USD, ou Yen, ou toute autre monnaie. Le mieux que j'ai pu obtenir jusqu'à présent est de formater un nombre en utilisant NumberFormat, puis rechercher la sortie pour les caractères non numériques et les remplacer par des symboles dérivés d'util.Change. Toutefois, cela est très fragile, et probablement pas assez fiables pour mes fins. Des idées? Toute aide est très appréciée.

23
demandé sur JPittard 2011-10-20 01:25:29

5 réponses

Essayez d'utiliser setCurrency sur l'instance renvoyée par getCurrencyInstance(Locale.ALLEMAGNE)

Cassé:

java.text.NumberFormat format = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.GERMANY);
System.out.println(format.format(23));

Sortie: 23,00 €

Fixe:

java.util.Currency usd = java.util.Currency.getInstance("USD");
java.text.NumberFormat format = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.GERMANY);
format.setCurrency(usd);
System.out.println(format.format(23));

sortie: 23,00 USD

42
répondu les2 2011-10-19 21:45:34

I would add to answer from les2 https://stackoverflow.com/a/7828512/1536382 que je crois que le nombre de fractions de chiffres n'est pas pris de la monnaie, il doit être réglé manuellement, sinon si le client (NumberFormat) a le Japon locale et la monnaie est EURO ou en_US, alors le montant est affiché 'a la' Yen', sans fractions de chiffres, mais ce n'est pas comme prévu, car en euro décimales sont pertinentes, également pour le japonais ;-).

donc l'exemple les2 pourrait être amélioré en ajoutant format.setMaximumFractionDigits(usd.getDefaultFractionDigits());, que dans ce cas particulier de l'exemple n'est pas pertinent mais il devient pertinent en utilisant un nombre avec des décimales et des locales.JAPON que les paramètres régionaux pour NumberFormat.

    java.util.Currency usd = java.util.Currency.getInstance("USD");
    java.text.NumberFormat format = java.text.NumberFormat.getCurrencyInstance(
          java.util.Locale.JAPAN);
    format.setCurrency(usd);
    System.out.println(format.format(23.23));
    format.setMaximumFractionDigits(usd.getDefaultFractionDigits());
    System.out.println(format.format(23.23));

sortie:

USD23
USD23.23

NumberFormat code quelque chose de similaire est fait pour la devise initiale/par défaut du format, appelant la méthode forme décimale#adjustforcemencydefault fraction digits. Cette opération n'est pas effectuée lorsque la monnaie est changée par la suite NumberFormat.setCurrency

22
répondu Testo Testini 2017-05-23 12:10:05
import java.util.*;
import java.text.*;

public class Solution {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double payment = scanner.nextDouble();
        scanner.close();

        NumberFormat lp;  //Local Payment

        lp = NumberFormat.getCurrencyInstance(Locale.US);
        System.out.println("US: " + lp.format(payment));

        lp = NumberFormat.getCurrencyInstance(new Locale("en", "in"));
        System.out.println("India: " + lp.format(payment));

        lp = NumberFormat.getCurrencyInstance(Locale.CHINA);
        System.out.println("China: " + lp.format(payment));

        lp = NumberFormat.getCurrencyInstance(Locale.FRANCE);
        System.out.println("France: " + lp.format(payment));
    }
}
6
répondu Ankush 2017-01-27 08:32:59
Scanner scanner = new Scanner(System.in);
double payment = scanner.nextDouble();
scanner.close();
java.text.NumberFormat formatUS = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.US);
String us=formatUS.format(payment);
java.text.NumberFormat formatIn = java.text.NumberFormat.getCurrencyInstance(new java.util.Locale("en","in"));
String india=formatIn.format(payment);
java.text.NumberFormat formatChina = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.CHINA);
String china=formatChina.format(payment);
java.text.NumberFormat formatFrance = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.FRANCE);
String france=formatFrance.format(payment);

System.out.println("US: " + us);
System.out.println("India: " + india);
System.out.println("China: " + china);
System.out.println("France: " + france);
1
répondu Tanvir Masood 2018-01-24 19:57:21

la meilleure façon est juste d'importer java.util.Paramètres régionaux

alors utilisez la méthode comme ceci:

NumberFormat.getCurrencyInstance (Locale.theCountryYouWant);

1
répondu Stephen Lee 2018-07-02 16:32:58