Java 与区域设置不同的货币的货币格式
在Android上,我试图用特定的数字格式格式化一些货币 我的号码必须使用法语格式(Java 与区域设置不同的货币的货币格式,java,android,Java,Android,在Android上,我试图用特定的数字格式格式化一些货币 我的号码必须使用法语格式(9 876 543,21)进行格式化,但货币符号的位置应取决于货币: 9 876 543,21欧元欧元 $9876543,21美元 这是我现在的代码(它使用java.util类,但结果与android.icu包相同): 输出为9876543,21美元,因为我的数字格式使用的是法语区域设置 注意:地区必须是法国(或法语)才能有良好的数字格式,我实际上不知道货币代码(例如欧元、美元或英镑),它将只是一个来自Web
9 876 543,21
)进行格式化,但货币符号的位置应取决于货币:
欧元9 876 543,21欧元
美元$9876543,21
java.util
类,但结果与android.icu
包相同):
输出为9876543,21美元
,因为我的数字格式使用的是法语区域设置
注意:地区必须是法国(或法语)才能有良好的数字格式,我实际上不知道货币代码(例如欧元、美元或英镑),它将只是一个来自Web服务的字符串
有没有办法告诉格式化程序我想要法文数字格式,但它需要尊重符号的货币位置?这非常有效,我想这就是您想要实现的目标
final Double of = Double.valueOf("9876543.21");
NumberFormat currencyInstance = NumberFormat.getCurrencyInstance(getLocalFromISO("EUR"));
Log.d("test", currencyInstance.format(of));
currencyInstance = NumberFormat.getCurrencyInstance(getLocalFromISO("GBP"));
Log.d("test", currencyInstance.format(of));
currencyInstance = NumberFormat.getCurrencyInstance(getLocalFromISO("SEK"));
Log.d("test", currencyInstance.format(of));
currencyInstance = NumberFormat.getCurrencyInstance(getLocalFromISO("USD"));
Log.d("test", currencyInstance.format(of));
private Locale getLocalFromISO(String iso4217code){
Locale toReturn = null;
for (Locale locale : NumberFormat.getAvailableLocales()) {
String code = NumberFormat.getCurrencyInstance(locale).
getCurrency().getCurrencyCode();
if (iso4217code.equals(code)) {
toReturn = locale;
break;
}
}
return toReturn;
}
//Prints
//9.876.543,21 €
//£9,876,543.21
// 9 876 543,21 kr
//US$9,876,543.21
嗨,我的问题是我不知道代码中的货币。我只从Web服务获取ISO代码(USD、EUR、GBP),因此无法为数字格式使用适当的区域设置。在你的例子中,美元的输出应该是在我的例子中,
$9 876 543,21
(法语格式,数字前带有货币符号)。我明白了,你不能只使用一个开关,或者一个嵌套的if语句吗?如果你从服务器上获得美元,你可以设置currencyInstance
给我们如果你获得欧元,你可以选择像法国这样的欧元国家,因为你只有几个,我认为这应该不会有问题,因为这是一个银行应用程序,理论上我可以获得任何货币代码,如欧元、美元、瑞典克朗、丹麦克朗,CAD等…这是很好的找到适当的本地显示最佳货币符号,但它仍然会打破数字格式。我想我想要的是标准的NumberFormat
。谢谢你的努力,我会保留你的代码,以防我需要实现一些真正定制的东西。你确定要根据货币使用符号吗?快速浏览一下网络,符号的位置似乎是由显示区域而不是货币决定的(因此在法语区域尾随$似乎是正确的)。这是我从网络阅读中学到的。但我刚刚被告知要实现这样的货币格式,我想知道是否可以用标准的NumberFormatter实现。我可能应该开始游说“商业”人士,让他们简单地用标准化格式格式化货币……看看这个库
final Double of = Double.valueOf("9876543.21");
NumberFormat currencyInstance = NumberFormat.getCurrencyInstance(getLocalFromISO("EUR"));
Log.d("test", currencyInstance.format(of));
currencyInstance = NumberFormat.getCurrencyInstance(getLocalFromISO("GBP"));
Log.d("test", currencyInstance.format(of));
currencyInstance = NumberFormat.getCurrencyInstance(getLocalFromISO("SEK"));
Log.d("test", currencyInstance.format(of));
currencyInstance = NumberFormat.getCurrencyInstance(getLocalFromISO("USD"));
Log.d("test", currencyInstance.format(of));
private Locale getLocalFromISO(String iso4217code){
Locale toReturn = null;
for (Locale locale : NumberFormat.getAvailableLocales()) {
String code = NumberFormat.getCurrencyInstance(locale).
getCurrency().getCurrencyCode();
if (iso4217code.equals(code)) {
toReturn = locale;
break;
}
}
return toReturn;
}
//Prints
//9.876.543,21 €
//£9,876,543.21
// 9 876 543,21 kr
//US$9,876,543.21