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.
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
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
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));
}
}
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);
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);