区域货币符号

时间:2012-10-02 16:15:57

标签: java android localization internationalization currency

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

Currency currency = Currency.getInstance(Locale.getDefault());
Log.v("TAG",currency.getSymbol());

当系统语言位于English (United States)时,右侧符号会显示($)。 但是当我选择语言Portuguese (Portugal)时,它会返回此符号¤

导致这种情况的原因是什么?

3 个答案:

答案 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)

一些想法;

  1. 可能是你为(欧元)获得了正确的符号,但你的字体/日志没有它,它只是看起来像那个符号?

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

  3. 请注意,除了en_US之外,语言环境数据不一定适用于此类中预定义为常量的任何语言环境,en_US是Java保证始终可用的唯一语言环境,并且它在不同的Android版本中有所不同,并且还可以受到运营商或定制构建的限制。 pt_PT was added in 2.3

  4. 关于您提供的选项,如果您查看Unicode's standards,因为它们已在API8及更高版本中实施,则葡萄牙仅作为区域(而非组合)存在。

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

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

答案 2 :(得分:2)

NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
    String cur = currencyFormatter.format(yourValue);

根据设备语言

将您的int / double格式化为货币
    String currency = cur.replaceAll("[0-9.,]","");

这就是如何通过替换所有数字,点和逗号来获得货币符号