Форматирование валют в иностранных языках в Java

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

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

5 ответов


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

сломанные:

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

выход: €23,00

основные:

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


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

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


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

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

затем используйте такой метод:

NumberFormat.getCurrencyInstance (Locale.theCountryYouWant);

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