区域货币符号

Fil*_*sta 11 java android localization currency internationalization

我在获取系统的默认货币符号时遇到一些问题.我这样得到货币符号:

Currency currency = Currency.getInstance(Locale.getDefault());
Log.v("TAG",currency.getSymbol());
Run Code Online (Sandbox Code Playgroud)

当系统语言在English (United States)右边时,符号显示up($).但是当我选择语言时,Portuguese (Portugal)它会返回此符号¤.

是什么导致这个?

Fil*_*sta 14

这似乎是一个已知问题(http://code.google.com/p/android/issues/detail?id=38622.我通过这种方式找到了一个可能的解决方案:

由于问题出在Symbol而不是Currency代码中,我解决了这个问题,创建了一个静态Map,其中键是CurrencyCode,值是Symbol.

public static final Map<String, String> MYCURRENCIES = new HashMap<String, String>(){
        {
            put("EUR","€");
            put("USD","$");
            (..)
        }
};
Run Code Online (Sandbox Code Playgroud)

为了获得区域设置信息中可用的所有(或几乎)货币代码,您可以执行以下操作:

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
  }
}
Run Code Online (Sandbox Code Playgroud)

使用CurrencyCodeSymbol创建Map后,您只需要这样:

Currency currency = Currency.getInstance(Locale.getDefault());
String curSymbol = MYCURRENCIES.get(currency.getCurrencyCode());
Run Code Online (Sandbox Code Playgroud)


Ben*_*ein 2

一些想法;

  1. 是否您获得了正确的(欧元)符号,但您的字体/日志没有它,并且它看起来只是像该符号?

  2. Locale 是一个非常活跃的类,它的构造函数没有错误检查。您可以轻松地看到标准中不支持或实际上不存在的区域设置(例如“de_US”表示“美国所说的德语”)。

  3. 请注意,区域设置数据不一定适用于此类中预定义为常量的任何区域设置,但 en_US 除外,这是 Java 保证始终可用的唯一区域设置,并且它在不同的 Android 版本中有所不同,并且还可能受到以下限制:运营商或自定义构建。pt_PT 是在 2.3 中添加的

  4. 关于您提出的选项,如果您检查Unicode 标准,因为它们已在 API8 及更高版本中实施,那么葡萄牙仅作为一个领土存在(而不是组合)。

  5. 因此,如果您仅从国家/地区代码创建部分区域设置实例,然后获取葡萄牙的货币符号,可能会更好。您将无法遵守Locale 类的预定义静态,因为它非常狭窄地支持不同的区域设置(这是一个简短的列表),但它应该可以工作,因为该区域设置具有您在系统中查找的数据。

  6. 我还会尝试查看currency.toString() 是否返回欧元(货币的ISO 4217 代码,通常是三个字母的缩写)。