【问题标题】:Locale Currency Symbol语言环境货币符号
【发布时间】:2012-09-23 12:53:07
【问题描述】:

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

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

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

这是什么原因造成的?

【问题讨论】:

  • 也许您使用的是 UTF-8 而不是 UTF-16?我不明白这是怎么发生的,但这是一个想法。
  • 我认为这将是您回答 Currency.getInstance(new Locale("YOUR LANGUAGE", countryCode)).getSymbol(); 的一个很好的解决方案;
  • 你可能会从这个link得到你的问题的答案

标签: java android localization internationalization currency


【解决方案1】:

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

由于问题出在符号而不是货币代码中,我解决了这个问题,创建了一个 staticMap,其中键是 CurrencyCode,值是 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 创建地图后,您只需要这样:

Currency currency = Currency.getInstance(Locale.getDefault());
String curSymbol = MYCURRENCIES.get(currency.getCurrencyCode());

【讨论】:

  • 这很酷,谢谢。 ps:对于其他所有人:而不是 Log.v 只是 MYCURRENCIES.put(a.getCurrencyCode(), a.getSymbol());
【解决方案2】:

一些想法;

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

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

  3. 请注意,语言环境数据不一定适用于此类中预定义为常量的任何语言环境,但 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 代码,通常是三个字母的首字母缩写词)。

【讨论】:

    【解决方案3】:
    NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
        String cur = currencyFormatter.format(yourValue);
    

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      • 2023-04-11
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多