нужно пространство между символом валюты и суммой - PullRequest
11 голосов
/ 13 июля 2011

Я пытаюсь напечатать валюту в формате INR следующим образом:

NumberFormat fmt = NumberFormat.getCurrencyInstance();
fmt.setCurrency(Currency.getInstance("INR"));
fmt.format(30382.50);

показывает Rs30,382.50, но в Индии это записывается как Rs. 30,382.50 (см. http://www.flipkart.com/) как решить без жесткого кодирования для INR?

Ответы [ 5 ]

6 голосов
/ 13 июля 2011

Это что-то вроде хака, но в очень похожей ситуации я использовал что-то вроде этого

NumberFormat format = NumberFormat.getCurrencyInstance(new Locale("en", "in"));
String currencySymbol = format.format(0.00).replace("0.00", "");
System.out.println(format.format(30382.50).replace(currencySymbol, currencySymbol + " "));

все валюты, с которыми мне приходилось иметь дело, занимали два десятичных знака, так что я мог сделать "0.00" для всех из них, но если вы планируете использовать что-то вроде японской иены, это нужно настроить. Есть NumberFormat.getCurrency().getSymbol(); но вместо Rs. он возвращает INR, поэтому его нельзя использовать для получения символа валюты.

4 голосов
/ 13 июля 2011

Проверьте, работает ли это:

DecimalFormat fmt = (DecimalFormat) NumberFormat.getInstance();
fmt.setGroupingUsed(true);
fmt.setPositivePrefix("Rs. ");
fmt.setNegativePrefix("Rs. -");
fmt.setMinimumFractionDigits(2);
fmt.setMaximumFractionDigits(2);
fmt.format(30382.50);

Редактировать: Исправлена ​​первая строка.

2 голосов
/ 25 января 2012

Я не вижу простого способа сделать это.Вот что я придумала ...

Ключ к получению действительного символа валюты, кажется, заключается в передаче локали назначения в Currency.getSymbol:

currencyFormat.getCurrency().getSymbol(locale)

Вот некоторый кодв основном это работает:

public static String formatPrice(String price, Locale locale, String currencyCode) {

    NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(locale);
    Currency currency = Currency.getInstance(currencyCode);
    currencyFormat.setCurrency(currency);

    try {
        String formatted = currencyFormat.format(NumberFormat.getNumberInstance().parse(price));
        String symbol = currencyFormat.getCurrency().getSymbol(locale);

        // Different locales put the symbol on opposite sides of the amount
        // http://en.wikipedia.org/wiki/Currency_sign
        // If there is already a space (like the fr_FR locale formats things),
        // then return this as is, otherwise insert a space on either side
        // and trim the result
        if (StringUtils.contains(formatted, " " + symbol) || StringUtils.contains(formatted, symbol + " ")) {
            return formatted;
        } else {
            return StringUtils.replaceOnce(formatted, symbol, " " + symbol + " ").trim();
        }
    } catch (ParseException e) {
        // ignore
    }
    return null;
}
1 голос
/ 09 ноября 2016

Более простой метод, своего рода обходной путь. Для моей локали символом валюты является «R $»

public static String moneyFormatter(double d){

    DecimalFormat fmt = (DecimalFormat) NumberFormat.getInstance();
    Locale locale = Locale.getDefault();
    String symbol = Currency.getInstance(locale).getSymbol(locale);
    fmt.setGroupingUsed(true);
    fmt.setPositivePrefix(symbol + " ");
    fmt.setNegativePrefix("-" + symbol + " ");
    fmt.setMinimumFractionDigits(2);
    fmt.setMaximumFractionDigits(2);
    return fmt.format(d);
}

Ввод:

moneyFormatter(225.0);

Выход:

"R$ 225,00"
1 голос
/ 13 июля 2011

Не думаю, что ты можешь.

Вы должны взглянуть на http://site.icu -project.org /

Может быть лучше форматирование валюты для конкретной локали, предоставляемое icu4j.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...