每当您显示货币时,您需要两条信息:货币代码和您显示结果的区域设置。例如,当您在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
不,我的问题是我不想使用区域设置进行格式化。我只想说给我英镑符号,它应该返回我£没有我说Locale.UK。 – Prasanna 2011-03-29 01:04:47
Java如何知道如何在不使用Locale的情况下对其进行格式化?这是指定设置的媒介,例如货币符号,小数点分隔符和其他格式设置。否则,你需要使用手动字符串操作来做你想做的。 – 2011-03-29 03:13:02