2011-03-28 281 views
3

我用的是弹簧货币格式化基于货币代码Java的货币格式化:强制使用的货币符号

public String format(Number number, String currencyCode) 
{ 
    CurrencyFormatter formatter = new CurrencyFormatter(); 
    formatter.setCurrency(Currency.getInstance(currencyCode)); 
    return formatter.print(number, Locale.getDefault());   
} 

所以,如果我把它作为格式来格式化值(10,“GBP”),然后格式化我无论地区是什么,都希望价值回到10.00英镑。

这可能吗?

回答

0

我不熟悉春天,但以下似乎是问题:Locale.getDefault()。相反,请尝试使用Locale类中定义的静态实例之一。

+0

不,我的问题是我不想使用区域设置进行格式化。我只想说给我英镑符号,它应该返回我£没有我说Locale.UK。 – Prasanna 2011-03-29 01:04:47

+0

Java如何知道如何在不使用Locale的情况下对其进行格式化?这是指定设置的媒介,例如货币符号,小数点分隔符和其他格式设置。否则,你需要使用手动字符串操作来做你想做的。 – 2011-03-29 03:13:02

5

每当您显示货币时,您需要两条信息:货币代码和您显示结果的区域设置。例如,当您在en_US语言环境中显示美元时,您希望它显示$,但在en_AU区域设置中,您希望它显示为美元(因为澳大利亚的货币也被称为“美元”,并且它们使用$符号AUD)。

您遇到的问题是,当您在其“非主要”语言环境中显示货币时,股票Java货币格式化程序会发臭。也就是说,几乎所有美国人在显示英镑和欧元时都会看英镑和欧元,但在en_US区域显示这些货币时,股票Java库会显示“英镑”和“欧元”。

我用下面这段代码解决了这个问题。我基本上是指定我自己的符号显示的国际货币时使用:

public static NumberFormat newCurrencyFormat(Currency currency, Locale displayLocale) { 
    NumberFormat retVal = NumberFormat.getCurrencyInstance(displayLocale); 
    retVal.setCurrency(currency); 

    //The default JDK handles situations well when the currency is the default currency for the locale 
    if (currency.equals(Currency.getInstance(displayLocale))) { 
     return retVal; 
    } 

    //otherwise we need to "fix things up" when displaying a non-native currency 
    if (retVal instanceof DecimalFormat) { 
     DecimalFormat decimalFormat = (DecimalFormat) retVal; 
     String correctedI18NSymbol = getCorrectedInternationalCurrencySymbol(currency, displayLocale); 
     if (correctedI18NSymbol != null) { 
      DecimalFormatSymbols dfs = decimalFormat.getDecimalFormatSymbols(); //this returns a clone of DFS 
      dfs.setInternationalCurrencySymbol(correctedI18NSymbol); 
      dfs.setCurrencySymbol(correctedI18NSymbol); 
      decimalFormat.setDecimalFormatSymbols(dfs); 
     } 
    } 

    return retVal; 
} 

private static String getCorrectedInternationalCurrencySymbol(Currency currency, Locale displayLocale) { 
    ResourceBundle i18nSymbolsResourceBundle = 
      ResourceBundle.getBundle("correctedI18nCurrencySymbols", displayLocale); 
    if (i18nSymbolsResourceBundle.containsKey(currency.getCurrencyCode())) { 
     return i18nSymbolsResourceBundle.getString(currency.getCurrencyCode()); 
    } else { 
     return currency.getCurrencyCode(); 
    } 
} 

然后,我有我的属性文件(correctedI18nCurrencySymbols.properties)这里我指定货币符号的使用方法:

# Note that these are the currency symbols to use for the specified code when displaying in a DIFFERENT locale than 
# the home locale of the currency. This file can be edited as needed. In addition, if in some case one specific locale 
# would use a symbol DIFFERENT than the standard international one listed here, then an additional properties file 
# can be added making use of the standard ResourceBundle loading algorithm. For example, if we decided we wanted to 
# show US dollars as just $ instead of US$ when in the UK, we could create a file i18nCurrencySymbols_en_GB.properties 
# with the entry USD=$ 
ARS=$AR 
AUD=AU$ 
BOB=$b 
BRL=R$ 
CAD=CAN$ 
CLP=Ch$ 
COP=COL$ 
CRC=\u20A1 
HRK=kn 
CZK=K\u010D 
DOP=RD$ 
XCD=EC$ 
EUR=\u20AC 
GTQ=Q 
GYD=G$ 
HNL=L 
HKD=HK$ 
HUF=Ft 
INR=\u20B9 
IDR=Rp 
ILS=\u20AA 
JMD=J$ 
JPY=JP\u00A5 
KRW=\u20A9 
NZD=NZ$ 
NIO=C$ 
PAB=B/. 
PYG=Gs 
PEN=S/. 
PHP=\u20B1 
PLN=\u007A\u0142 
RON=lei 
SGD=S$ 
ZAR=R 
TWD=NT$ 
THB=\u0E3F 
TTD=TT$ 
GBP=\u00A3 
USD=US$ 
UYU=$U 
VEF=Bs 
VND=\u20AB