Подтвердить что ты не робот

Как получить экземпляр NumberFormat из кода валюты?

Как я могу получить экземпляр NumberFormat (или DecimalFormat), соответствующий коду валюты ISO 4217 (например, "EUR" или "USD" ), чтобы правильно отформатировать цены?

Примечание 1: Проблема заключается в том, что классы NumberFormat/DecimalFormat имеют getCurrencyInstance(Locale locale), но я не могу понять, как для перехода к объекту Locale из кода валюты ISO 4217.

Примечание 2: Существует также класс java.util.Currency, который имеет метод getInstance(String currencyCode) (возвращает Currencyэкземпляр для данного кода валюты ISO 4217), но снова я не могу понять как получить от объекта Currency до NumberFormatэкземпляр...

4b9b3361

Ответ 1

Я не уверен, что понял это правильно, но вы можете попробовать что-то вроде:

public class CurrencyTest
{
    @Test
    public void testGetNumberFormatForCurrencyCode()
    {
        NumberFormat format = NumberFormat.getInstance();
        format.setMaximumFractionDigits(2);
        Currency currency = Currency.getInstance("USD");
        format.setCurrency(currency);

        System.out.println(format.format(1234.23434));
    }   
}

Вывод:

1,234.23

Обратите внимание, что я устанавливаю максимальное количество дробных цифр отдельно, NumberFormat.setCurrency не касается максимального количества дробных цифр:

Устанавливает валюту, используемую этим форматом числа, при форматировании валюты значения. Это не обновляет минимальное или максимальное количество дроби цифры, используемые в числовом формате.

Ответ 2

Отображение иногда одно для многих... Как и евро, используется во многих странах (локалях)...

Просто потому, что код валюты совпадает с тем, что формат может отличаться, как показывает этот пример:

private static Collection<Locale> getLocalesFromIso4217(String iso4217code) {
    Collection<Locale> returnValue = new LinkedList<Locale>();
    for (Locale locale : NumberFormat.getAvailableLocales()) {
        String code = NumberFormat.getCurrencyInstance(locale).
        getCurrency().getCurrencyCode();
        if (iso4217code.equals(code)) {
            returnValue.add(locale);
        }
    }  
    return returnValue;
}

public static void main(String[] args) {
    System.out.println(getLocalesFromIso4217("USD"));
    System.out.println(getLocalesFromIso4217("EUR"));
    for (Locale locale : getLocalesFromIso4217("EUR")) {
        System.out.println(locale + "=>" + NumberFormat.getCurrencyInstance(locale).format(1234));
    }
}

Выход

[en_US, es_US, es_EC, es_PR]
[pt_PT, el_CY, fi_FI, en_MT, sl_SI, ga_IE, fr_BE, es_ES, de_AT, nl_NL, el_GR, it_IT, en_IE, fr_LU, nl_BE, ca_ES, sr_ME, mt_MT, fr_FR, de_DE, de_LU]

pt_PT=>1.234,00 €
el_CY=>€1.234,00
fi_FI=>1 234,00 €
en_MT=>€1,234.00
sl_SI=>€ 1.234
ga_IE=>€1,234.00
fr_BE=>1.234,00 €
es_ES=>1.234,00 €
de_AT=>€ 1.234,00
nl_NL=>€ 1.234,00
el_GR=>1.234,00 €
it_IT=>€ 1.234,00
en_IE=>€1,234.00
fr_LU=>1 234,00 €
nl_BE=>1.234,00 €
ca_ES=>€ 1.234,00
sr_ME=>€ 1.234,00
mt_MT=>€1,234.00
fr_FR=>1 234,00 €
de_DE=>1.234,00 €
de_LU=>1.234,00 €

Ответ 3

Локаль может использоваться как для получения стандартной валюты для локали, так и для правильной печати любого символа валюты в указанном вами локали. Это две разные операции и не связаны между собой.

Из учебника по интернационализации Java вы сначала получаете экземпляр валюты, используя либо код Locale, либо код ISO. Затем вы можете распечатать символ, используя другой язык. Поэтому, если вы получите валюту США из en_US Locale и вызовите getSymbol(), она напечатает "$". Но если вы назовете getSymbol (Locale) с британским языком, он напечатает "USD".

Итак, если вам все равно, что ваш текущий пользовательский язык, и вы просто заботитесь о валютах, тогда вы можете игнорировать Locale во всех случаях.

Если вы заботитесь о правильном представлении символа валюты на основе вашего текущего пользователя, вам необходимо получить локаль пользователя, специфичного для местоположения пользователя.

Ответ 4

Для полноты, хотя я никогда не использовал ее, вы можете попробовать Joda Money попробовать. Если это так хорошо, как Joda-Time, это, вероятно, проще и мощнее, чем стандартный материал JDK.

Ответ 5

Попробуйте выполнить следующий метод:

private static NumberFormat getNumberFormat(String currencyCode)
{
    Currency currency = Currency.getInstance(currencyCode);

    Locale[] locales = NumberFormat.getAvailableLocales();

    for (Locale locale : locales)
    {
        NumberFormat numberFormat = NumberFormat.getCurrencyInstance(locale);

        if (numberFormat.getCurrency() == currency)
            return numberFormat;
    }

    return null;
}

Ответ 6

public class PriceHelper {
    public static String formatPrice(Context context, String currencyCode, 
                                      double price) {
        if (price == 0) {
            return context.getString(R.string.free);
        }
        Currency currency = Currency.getInstance(currencyCode);
        NumberFormat format = NumberFormat.getCurrencyInstance();
        format.setCurrency(currency);
        return format.format(price);
    }
}

Ответ 7

Вот способ:

String formatPrice(double amnt) {
    NumberFormat formatter = NumberFormat.getCurrencyInstance();
    Currency currency = Currency.getInstance("USD");
    formatter.setCurrency(currency);
    return formatter.format(amnt);
}