Форматирование валют в иностранных локалях на Java - PullRequest
28 голосов
/ 20 октября 2011

Я делаю все возможное, чтобы найти способ форматирования иностранных валют в различных языковых стандартах, которые не используются по умолчанию для этой валюты, с использованием Java.Я нашел java.util.Currency, который может представлять правильный символ для использования в различных локалях.То есть, для доллара, он дает мне символ $ в США, а также доллары США или доллары США в других странах.Кроме того, я нашел java.text.NumberFormat, который будет форматировать валюту для определенной локали.Моя проблема - util.Currency предоставит правильные символы и коды для представления валют в их локалях не по умолчанию, но не будет форматировать валюту каким-либо специфическим для локали способом.NumberFormat предполагает, что число, которое я передаю, вместе с локалью, является валютой этой локали, , а не иностранной валютой.

Например, если я использую getCurrencyInstance (Locale.GERMANY), а затем формат (1000), предполагается, что я форматирую 1000 евро.В действительности мне может потребоваться правильное представление в немецком языке (правильный десятичный разделитель и разделитель тысяч, указывать ли символ до или после суммы) для доллара, йены или любой другой валюты.Лучшее, что я смог получить на данный момент, - это отформатировать число с помощью NumberFormat, затем найти в выходных данных нецифровые символы и заменить их на символы, полученные из util.Currency.Однако, это очень хрупко, и, вероятно, недостаточно надежно для моих целей.Идеи?Буду признателен за любую оказанную помощь.

Ответы [ 6 ]

44 голосов
/ 20 октября 2011

Попробуйте использовать setCurrency для экземпляра, возвращенного getCurrencyInstance (Locale.GERMANY)

Сломанный

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

Выход: 23,00 €

Fixed

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

Вывод: 23,00 USD

23 голосов
/ 29 сентября 2013

Я бы добавил в ответ от les2 https://stackoverflow.com/a/7828512/1536382, что я считаю, что число цифр дроби не берется из валюты, оно должно быть установлено вручную, в противном случае, если клиент (NumberFormat) имеет языковой стандарт JAPAN, а валюта - EUROили en_US, тогда сумма отображается «а-ля» иена, без цифр дроби, но это не так, как ожидалось, так как в евро значат десятичные дроби, в том числе и для японского; -).

Так что пример les2 может бытьулучшено добавление format.setMaximumFractionDigits(usd.getDefaultFractionDigits());, которое в данном конкретном случае не является релевантным, но становится релевантным, если использовать число с десятичными знаками и Locale.JAPAN в качестве локали для 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));

выведет:

USD23
USD23.23

В коде NumberFormat выполняется нечто подобное для начальной валюты / валюты по умолчанию, вызывая метод DecimalFormat # AdjustForCurrencyDefaultFractionDigits .Эта операция не выполняется, если впоследствии валюта изменяется с помощью NumberFormat.setCurrency

6 голосов
/ 27 января 2017
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));
    }
}
2 голосов
/ 24 января 2018
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 голос
/ 02 июля 2018

Лучший способ - просто импортировать java.util.Locale

. Затем используйте метод, подобный следующему:

NumberFormat.getCurrencyInstance (Locale.theCountryYouWant);

например, NumberFormat.getCurrencyInstance (Locale.US);

0 голосов
/ 10 июля 2019

Код ниже, Ref Язык Java :

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