System.Globalization.RegionInfo 有效文化输入的完整列表

System.Globalization.RegionInfo complete list of valid culture inputs

我有一份从外部来源获取的 ISO 3166 两字母国家/地区代码列表。对于每个,我创建

     new System.Globalization.RegionInfo(countryCode) 

偶尔一个无效导致 ArgumentException "Culture name 'xx' is not supported."

我想要一个函数来确定国家代码是否有效,然后再将它传递给构造函数。这是我的尝试:

    private bool IsCultureValid(string cultureName)
    {
        return CultureInfo.GetCultures(CultureTypes.AllCultures)
            .Any(c => c.Name.Equals(cultureName, StringComparison.InvariantCultureIgnoreCase));
    }

函数 returns 对许多输入都是假阴性(函数 returns 是假的,但如果我尝试的话,我可以用该输入创建一个 RegionInfo 对象)。一些输入:

我错过了什么?这里有更好的方法吗?提前致谢!

您可以编写一个函数,在 try/catch 块和 return CultureInfo 对象而不是 bool 中创建特定文化。

顺便说一下,墨西哥、洪都拉斯没有 ve 这样的文化,它是 es-VE 等等。"derived" 文化的文化信息必须有父文化代码。 en-AU、en-US 等

http://www.localeplanet.com/dotnet/es-VE/index.html

要获取已安装区域性的所有正确值的列表,请使用:

CultureInfo.GetCultures();

https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.getcultures(v=vs.110).aspx

你弄错了,因为它们不存在。 以下是通过以下循环获得的所有培养物的列表:

foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
    ci.Name
}

ar,bg,ca,zh-Hans,cs,da,de,el,en,es,fi,fr,he,hu,is,it,ja,ko,nl,no,pl,pt ,rm,ro,ru,hr,sk,sq,sv,th,tr,ur,id,uk,be,sl,et,lv,lt,tg,fa,vi,hy,az,eu,hsb,mk ,tn,xh,zu,af,ka,fo,hi,mt,se,ga,ms,kk,ky,sw,tk,uz,tt,bn,pa,gu,or,ta,te,kn,ml ,as,mr,sa,mn,bo,cy,km,lo,gl,cook,syr,si,iu,am,tzm,ne,fy,ps,fil,dv,ha,yo,quz ,nso,ba,lb,kl,ig,ii,arn,moh,br,ug,mi,oc,co,gsw,sah,qut,rw,wo,prs,gd,ar-SA,bg-BG, ca-ES,zh-TW,cs-CZ,da-DK,de-DE,el-GR,in-US,fi-FI,fr-FR,he-IL,hu-HU,is-IS,it- IT,yes-JP,co-KR,nl-NL,nb-NO,pl-PL,pt-BR,rm-CH,ro-RO,ru-RU,hr-HR,sk-SK,sq-AL, sv-SE,th-TH,tr-TR,ur-PK,id-ID,uk-UA,be-BY,sl-SI,et-EE,lv-LV,lt-LT,tg-Cyrl-TJ, fa-IR,vi-VN,hy-AM,az-Latn-AZ,eu-ES,hsb-DE,mk-MK,tn-ZA,xh-ZA,zu-ZA,af-ZA,ka-GE, fo-FO,hi-IN,mt-MT,se-NO,ms-MY,kk-KZ,ky-KG,sw-KE,tk-TM,uz-Latn-UZ,tt-RU,bn-IN, pa-IN,gu-IN,or-IN,ta-IN,te-IN,kn-IN,ml-IN,as-IN,mr-IN,sa-IN,mn-MN,bo-CN,cy- GB,km-KH,lo-LA,gl-ES,cook-IN,syr-SY,si-LK,iu-Cans-CA,am-ET,ne-NP,fy-NL,ps- AF,fil-PH,dv-MV,ha-Latn-NG,yo-NG,quz-BO,all-ZA,ba-RU,lb-LU,kl-GL,ig-NG,ii-CN,arn -CL,moh-CA,br-FR,ug-CN,mi-NZ,oc-FR,co-FR,gsw-FR,sah-RU,qut-GT,rw-RW,wo-SN,prs-AF ,gd-GB,ar-IQ,zh-CN,de-CH,en-GB,es-MX,fr-BE,it-CH,nl-BE,nn-NO,pt-PT,sr-Lat-CS ,sv-FI,az-Cyrl-AZ,dsb-DE,se-SE,ga-IE,ms-BN,uz-Cyrl-UZ,bn-BD,mn-Mong-CN,iu-Latin-CA,tzm -Latin-DZ,quz-EC,ar-EG,zh-HK,de-AT,en-AU,es-ES,fr-CA,sr-Cyrl-CS,se-FI,quz-PE,ar-LY ,zh-SG,the-LU,a-CA,is-GT,fr-CH,hr-BA,smj-NO,ar-DZ,zh-MO,the-LI,a-NZ,is-CR,fr -LU,bs-Latin-BA,smj-SE,ar-MA,en-IE,es-PA,fr-MC,sr-Latin-BA,sma-NO,ar-TN,en-ZA,es-DO ,sr-Cyrl-BA,sma-SE,ar-OM,en-JM,es-VE,bs-Cyrl-BA,sms-FI,ar-YE,en-029,es-CO,sr-Latin-RS ,smn-FI,ar-SY,en-BZ,es-PE,sr-Cyrl-RS,ar-JO,en-TT,es-AR,sr-Latn-ME,ar-LB,en-ZW,es -EC,sr-Cyrl-ME,is-KW,is-PH,is-CL,is-AE,is-UY,is-BH,is-PY,is-QA,is-IN,is-BO,is -MY,is-SV,en-SG,is-HN,​​is-NI,is-PR,is-US,bs-Cyrl,bs-Latin,sr-Cyrl,sr-Latin,smn,az-Cyrl,sms ,zh,nn,bs,az-Latin,sma,uz-Cyrl,mn-Cyrl,iu-Cans,zh-Hant,nb,sr,tg-Cyrl,dsb,smj,uz-Latin,mn-Mong,iu -拉丁语,tzm-拉丁语,ha-拉丁语,zh-CHS,zh-CHT

所以你可以看到它不包含 zw,但它有 en-ZW 类似地对于 au 它有 en-AU

我意识到这是一个过时的问题。但是,我最近 运行 遇到了类似的情况,我需要验证传入的 ISO 货币代码。我可以在这里和其他地方找到的所有示例都依赖于捕获在尝试创建具有无效 code/id 的区域或文化时抛出的异常。这不是一个好习惯。

我自己对该问题的研究使我意识到,在大多数情况下,问题出在不变文化和中性文化上。一旦将它们从 CultureInfo 数组中删除,就可以生成仅包含有效 RegionInfo 对象的列表。

这是对我自己的问题的推断,以提供所要求的答案。尽管显然可以将此变体应用于任何您只需要有效 RegionInfo 对象的地方。

private bool IsValidRegion(string isoCountryCode)
    {
        return CultureInfo.GetCultures(CultureTypes.AllCultures)
            .Where(x => !x.Equals(CultureInfo.InvariantCulture)) //Remove the invariant culture as a region cannot be created from it.
            .Where(x => !x.IsNeutralCulture) //Remove nuetral cultures as a region cannot be created from them.
            .Select(x => new RegionInfo(x.LCID))
            .Any(x => x.Name.Equals(isoCountryCode, StringComparison.InvariantCulture));
    }

编辑: 除非使用自定义文化,否则这实际上可以更直接地完成。 只需使用 "CultureTypes.SpecificCultures" 枚举值。

这是一个类似评论的 post,不一定是完整的答案。

与其他答案一样,区域信息可以从文化信息中创建。例如,在我当前的系统上,代码:

var comp = Comparer<RegionInfo>.Create((x, y) => string.Compare(x.Name, y.Name));
var count = 0;
var set = new SortedSet<RegionInfo>(comp);
foreach (var sci in CultureInfo.GetCultures(CultureTypes.SpecificCultures)) {
    set.Add(new RegionInfo(sci.LCID));
    ++count;
}

贯穿 574 特定 文化,但只创造了 142 个不同的地区(一个地区可能拥有多种语言,所以这并不罕见)。

但是(至少在我的系统上)有些区域不是由文化产生的。

例如,在我的系统上,如果我这样做:

var comp = Comparer<RegionInfo>.Create((x, y) => string.Compare(x.Name, y.Name));
var set2 = new SortedSet<RegionInfo>(comp);
for (var i = 0; i < 1000; ++i) {
    try {
        set2.Add(new RegionInfo($"{i:D3}"));
    } catch (ArgumentException) {
    }
}
for (var a = 'A'; a <= 'Z'; ++a) {
    for (var b = 'A'; b <= 'Z'; ++b) {
        try {
            set2.Add(new RegionInfo($"{a}{b}"));
        } catch (ArgumentException) {
        }
    }
}

然后我得到 250 个不同的 RegionInfo。所以似乎有超过 100 个 RegionInfo 不是来自 CultureInfo.

另请注意,尽管

new RegionInfo(CultureInfo.InvariantCulture.LCID)

抛出异常没有与不变文化相关的区域(文化 ID:0x7F),仍然可以(同样,现在在我的系统上)执行以下操作:

new RegionInfo("IV")

创建一个 EnglishNameInvariant Country 的实例。