我在获取系统的默认货币符号时遇到一些问题。 我这样得到货币符号:
Currency currency = Currency.getInstance(Locale.getDefault());
Log.v("TAG",currency.getSymbol());
当系统语言位于English (United States)
时,右侧符号会显示($
)。
但是当我选择语言Portuguese (Portugal)
时,它会返回此符号¤
。
导致这种情况的原因是什么?
答案 0 :(得分:13)
这似乎是一个已知问题(http://code.google.com/p/android/issues/detail?id=38622。 我以这种方式找到了一个可能的解决方案:
由于问题出在Symbol而不是Currency代码中,我解决了这个问题,创建了一个静态Map
,其中键是 CurrencyCode ,值是符号。
public static final Map<String, String> MYCURRENCIES = new HashMap<String, String>(){
{
put("EUR","€");
put("USD","$");
(..)
}
};
为了获得区域信息中可用的所有(或几乎)货币代码,您可以执行以下操作:
for (Locale ll: Locale.getAvailableLocales()){
try {
Currency a = Currency.getInstance(ll);
Log.v("MyCurrency",a.getCurrencyCode()+"#"+a.getSymbol());
}catch (Exception e){
// when the locale is not supported
}
}
使用 CurrencyCode 和 Symbol 创建Map后,您只需要这样的内容:
Currency currency = Currency.getInstance(Locale.getDefault());
String curSymbol = MYCURRENCIES.get(currency.getCurrencyCode());
答案 1 :(得分:2)
一些想法;
可能是你为(欧元)获得了正确的符号,但你的字体/日志没有它,它只是看起来像那个符号?
Locale是一个非常活泼的类,它的构造函数没有错误检查。您可以轻松查看标准中不支持或不存在的区域设置(例如“de_US”表示“在美国使用德语”)。
请注意,除了en_US之外,语言环境数据不一定适用于此类中预定义为常量的任何语言环境,en_US是Java保证始终可用的唯一语言环境,并且它在不同的Android版本中有所不同,并且还可以受到运营商或定制构建的限制。 pt_PT was added in 2.3
关于您提供的选项,如果您查看Unicode's standards,因为它们已在API8及更高版本中实施,则葡萄牙仅作为区域(而非组合)存在。
如果您因此仅从国家/地区代码创建部分区域设置实例,然后获取葡萄牙的货币符号可能会更好。您将无法遵守预定义的statics of Locale's class,因为它非常支持不同的区域设置(这是一个简短的列表),但它应该起作用,因为此区域设置包含您在系统中查找的数据。
我还会尝试查看currency.toString()是否返回EUR(货币的ISO 4217代码,通常是三个字母的缩写)。
答案 2 :(得分:2)
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
String cur = currencyFormatter.format(yourValue);
根据设备语言
将您的int / double格式化为货币 String currency = cur.replaceAll("[0-9.,]","");
这就是如何通过替换所有数字,点和逗号来获得货币符号