11

我在获取系统的默认货币符号时遇到了一些问题。我以这种方式获取货币符号:

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

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

这可能是什么原因造成的?

4

3 回答 3

15

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

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

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
  }
}

使用CurrencyCodeSymbol创建 Map 后,您只需执行以下操作:

Currency currency = Currency.getInstance(Locale.getDefault());
String curSymbol = MYCURRENCIES.get(currency.getCurrencyCode());
于 2013-02-04T11:09:52.383 回答
2

一些想法;

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

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

  3. 请注意,语言环境数据不一定适用于此类中预定义为常量的任何语言环境,但 en_US 除外,这是 Java 保证始终可用的唯一语言环境,并且在不同的 Android 版本中有所不同,并且还可以通过以下方式进行限制操作员或自定义构建。pt_PT 是在 2.3 中添加的

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

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

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

于 2013-02-01T23:41:16.503 回答
1
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
    String cur = currencyFormatter.format(yourValue);

这会将您的 int/double 格式化为基于设备语言的货币

    String currency = cur.replaceAll("[0-9.,]","");

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

于 2015-05-29T00:25:49.657 回答