如何验证&从字符串中实例化Java Locale?

时间:2013-03-27 16:03:15

标签: java validation locale

我的应用程序正在从外部进程提供字符串,其中每个字符串的长度为2或5个字符,并表示java.util.Locale s。例如:

  

EN-US

     

KO

第一个例子是一个5-char字符串,其中“en”是ISO语言代码,“us”是ISO国家代码。这应该对应于“en_US”区域设置。第二个示例只是一个2-char字符串,其中“ko”是ISO语言代码,应该对应于“ko_KR”(韩语)语言环境。

我需要一种方法来获取这些字符串(2或5-char类型),验证它(作为受支持的Java 6 区域设置),然后使用它创建Locale实例。

我本以为Locale带来了开箱即用的验证,但不幸的是这段代码运行时没有抛出异常:

Locale loc = new Locale("waawaaweewah", "greatsuccess");

// Prints: "waawaaweewah"
System.out.println(loc.getDisplayLanguage());

所以我问,给我这些字符串将给我的2个表格,我怎么能:

  • 验证字符串(两种形式)并为与不存在或不支持的Java 6 Locales对应的字符串抛出异常;和
  • 从字符串中实例化一个新的Locale?这个问题真的适用于2-char形式,我可能只有“ko”并需要它映射到“ko_KR”Locale等。

提前致谢!

2 个答案:

答案 0 :(得分:7)

Locale.getISOCountries()Locale.getISOLanguages()

分别返回ISO 3166和ISO 639中定义的所有双字母国家/地区和语言代码的列表,可用于创建区域设置。

您可以使用它来验证您的输入。

答案 1 :(得分:2)

您有两种选择,

  1. 使用库执行此操作commons-langLocaleUtils类具有可以将String解析为Locale的方法。
  2. 虽然您自己的方法,但此处的验证并非易事,因为有许多不同的国家/地区代码集对Locale有效 - 请参阅javadoc
  3. 一个起点是分割String并打开元素数量:

    public static Locale parseLocale(final String locale) {
        final String[] localeArr = locale.split("_");
        switch (localeArr.length) {
            case 1:
                return new Locale(localeArr[0]);
            case 2:
                return new Locale(localeArr[0], localeArr[1]);
            case 3:
                return new Locale(localeArr[0], localeArr[1], localeArr[2]);
            default:
                throw new IllegalArgumentException("Invalid locale format;");
        }
    }
    

    据推测,您需要获取所有有效国家/地区代码和语言的列表,并在调用构造函数之前将String[]中的元素与有效值进行比较。