web-dev-qa-db-fra.com

Formatage des devises dans des paramètres régionaux étrangers en Java

Je fais de mon mieux pour trouver un moyen de formater les devises étrangères dans divers pays qui ne sont pas par défaut pour cette devise, en utilisant Java. J'ai trouvé Java.util.Currency, qui peut représenter le symbole approprié à utiliser pour divers paramètres régionaux. Autrement dit, pour l'USD, il me fournit le symbole $ aux États-Unis et US $ ou USD dans les autres pays. En outre, j'ai trouvé Java.text.NumberFormat, qui formatera une devise pour un environnement local spécifique. Mon problème - util.Currency fournira des symboles et des codes appropriés pour représenter les devises dans leurs paramètres régionaux non définis par défaut, mais ne formatera pas la devise de manière spécifique aux paramètres régionaux. NumberFormat suppose que le numéro que je lui transmets, avec une locale, est la devise de cette locale, pas une devise étrangère.

Par exemple, si j'utilise getCurrencyInstance (Locale.GERMANY) puis format (1000), cela suppose que je formate 1000 euros. En réalité, j'ai peut-être besoin de la bonne représentation localisée en Allemagne (séparateur décimal et milliers correct, que ce soit pour mettre le symbole avant ou après le montant) pour USD, ou Yen, ou toute autre devise. Le meilleur que j'ai pu tirer jusqu'à présent est de formater un nombre à l'aide de NumberFormat, puis de rechercher dans la sortie des caractères non numériques et de les remplacer par des symboles dérivés de util.Currency. Cependant, c'est très fragile et probablement pas assez fiable pour mes besoins. Des idées? Toute aide est très appréciée.

29
JPittard

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

Cassé :

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

Rendement: 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

45
les2

J'ajouterais pour répondre à partir de les2 https://stackoverflow.com/a/7828512/1536382 que je crois que le nombre de chiffres de fraction n'est pas tiré de la devise, il doit être défini manuellement, sinon si client (NumberFormat) a les paramètres régionaux JAPON et la devise est EURO ou en_US, puis le montant est affiché `` à la '' Yen, sans chiffres de fraction, mais ce n'est pas comme prévu car en décimales euro sont pertinentes, également pour le japonais ;-).

Ainsi, 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 Locale.JAPAN comme 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));

affichera:

USD23
USD23.23

Dans code NumberFormat quelque chose de similaire est fait pour la devise initiale/par défaut du format, méthode d'appel DecimalFormat # adjustForCurrencyDefaultFractionDigits . Cette opération n'est pas effectuée lorsque la devise est modifiée par la suite avec NumberFormat.setCurrency

23
Testo Testini
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));
    }
}
7
Ankush
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);
2
Tanvir Masood

Le meilleur moyen consiste simplement à importer Java.util.Locale

Utilisez ensuite la méthode comme ceci:

NumberFormat.getCurrencyInstance (Locale.theCountryYouWant);

par exemple. NumberFormat.getCurrencyInstance (Locale.US);

1
Stephen Lee

Code ci-dessous, Ref Java Locale :

Scanner scanner = new Scanner(System.in);
double payment = scanner.nextDouble();
scanner.close();

// Write your code here.
String china = NumberFormat.getCurrencyInstance(new Locale("zh", "CN")).format(payment);
String india = NumberFormat.getCurrencyInstance(new Locale("en", "IN")).format(payment);
String us = NumberFormat.getCurrencyInstance(Locale.US).format(payment);
String france = NumberFormat.getCurrencyInstance(Locale.FRANCE).format(payment);

System.out.println("US: " + us);
System.out.println("India: " + india);
System.out.println("China: " + china);
System.out.println("France: " + france);
0
TechFree