如果你有ISO国家代码`US`、`FR`,如何获取Locale代码(`Locale.US`、`Locale.FRANCE`)?

25

如果你有国家代码USFR(ISO-3166-1 alpha-2 国家代码),那么如何获取区域设置代码(Locale.USLocale.FRANCE)以执行以下操作:

System.out.println(DecimalFormat.getCurrencyInstance(Locale.US).format(12.34));
System.out.println(DecimalFormat.getCurrencyInstance(Locale.FRANCE).format(12.34));

$12.34
12,34 €
5个回答

28
由于Locale只用于保存语言而不是国家,因此您无法直接使用国家代码创建Locale。Locale可以为特定国家的特定变体保存语言,但它首先是一种语言。语言与国家之间没有一对一的关系。大多数语言在多个国家使用,许多国家有多种语言。
如果您有语言的国家代码,可以使用new Locale(code)来创建Locale。但是,对于国家代码,您只能调用getAvailableLocales,遍历结果并查找具有所需国家代码的Locale。但可能有多个Locale符合条件。

7
在Java7中有Locale.Builder,但在此之前没有简单的方法。然而,您可以创建一个实用程序方法:
  1. 循环使用Locale.getAvailableLocales()
  2. 对于每个语言环境,请检查locale.getCountryCode().equals(countryCodeParam),并返回它

Locale.Builder可以帮助从国家代码获取默认语言吗? - Amit Kumar

5
您可以创建区域设置,
new Locale("en", "US")
new Locale("fr", "FR")

或者

遍历Locale.getAvailableLocales()直到找到您的语言环境,然后使用该实例。


2

地域设置最重要的是由ISO-639语言代码指定,也可能有ISO-3166国家代码和变体。 Locale类具有构造函数,可以仅接受语言代码,或者另外添加国家代码,或者另外添加变体。

如果您只有国家代码,则首先需要一个将其转换为语言代码的映射表 - 但这并不一定会产生唯一的结果,许多国家使用多种官方语言。


0

当然,被接受的答案是正确的,但仍需要一个解决方案。因此,这是我尝试实现它的方式:

   public static Locale countryCodeToLocate(String countryCode) {

        for(Locale l : Locale.getAvailableLocales()) {
            // try to convert `en_US` into `us`
            String lang = l.toString().toLowerCase();
            String prefix = l.getLanguage().toLowerCase();
            if (lang.startsWith(prefix + "_" + countryCode)) {
                return l;
            }
        }
        return Locale.getDefault();
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接