Требуется место между символом валюты и суммой
Я пытаюсь напечатать валюту формата 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/)
как решить без hardcoding для INR?
Ответы
Ответ 1
Это немного взломать, но в очень похожей ситуации я использовал что-то вроде этого
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
, поэтому его нельзя использовать для получения символа валюты.
Ответ 2
Посмотрите, работает ли это:
DecimalFormat fmt = (DecimalFormat) NumberFormat.getInstance();
fmt.setGroupingUsed(true);
fmt.setPositivePrefix("Rs. ");
fmt.setNegativePrefix("Rs. -");
fmt.setMinimumFractionDigits(2);
fmt.setMaximumFractionDigits(2);
fmt.format(30382.50);
Изменить: Исправлена первая строка.
Ответ 3
Я не вижу никакого простого способа сделать это. Вот что я придумал...
Ключ к получению фактического символа валюты, кажется, передает языковой стандарт назначения в 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;
}
Ответ 4
Я не думаю, что ты можешь.
Вы должны взглянуть на http://site.icu-project.org/
Возможно, будет лучшее языковое форматирование валюты, предоставляемое icu4j.
Ответ 5
Более простой способ, способ обхода.
Для моего языка символ валюты - "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"