系统.全球化.区域信息有效区域性输入的完整列表

本文关键字:列表 输入 区域性 全球化 区域 信息 有效 系统 | 更新日期: 2023-09-27 17:55:40

我有一个从外部来源获得的ISO 3166双字母国家代码列表。对于每个,我创建

     new System.Globalization.RegionInfo(countryCode) 

有时一个无效,导致参数异常"不支持区域性名称'xx'"。

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

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

该函数为许多输入返回假负(函数返回 false,但如果我尝试,我可以使用该输入创建一个 RegionInfo 对象)。一些输入:

  • ZW (津巴布韦)
  • 非盟(澳大利亚)
  • MX (墨西哥)
  • ve(委内瑞拉玻利瓦尔共和国)
  • hn (洪都拉斯)
  • 千瓦 (科威特)

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

系统.全球化.区域信息有效区域性输入的完整列表

我意识到这是一个过时的问题。但是,我最近遇到了类似的情况,我需要验证传入的 ISO 货币代码。我能在这里和其他地方找到的所有示例都依赖于捕获在尝试使用无效代码/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.SpecificCulture"枚举值。

您可以编写一个函数,在 try/catch 块中创建特定的区域性,并返回 CultureInfo 对象而不是布尔值。

顺便说一句,没有像ve这样的文化,它是es-VE等等,墨西哥,洪都拉斯。"派生"区域性的区域性信息之前必须具有父区域性代码。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.getculture(v=vs.110).aspx

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

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

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 的实例。

你得到的是假的,因为它们不存在。以下是通过以下循环获得的所有区域性的列表:

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,your,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,kok,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,en-US,fi-fi,fr-fr,he-il,hu-HU,is-IS,it-IT,ja-JP,ko-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,your-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,kok-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,nso-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-Latn-CS,sv-FI,az-Cyrl-AZ,dsb-DE,se-SE,ga-IE,ms-BN,uz-Cyrl-UZ,bn-BD,mn-Mong-CN,iu-Latn-CA,tzm-Latn-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,de-LU,en-CA,es-GT,fr-CH,hr-BA,smj-NO,ar-DZ,zh-MO,de-LI,en-NZ,es-CR,fr-LU,bs-Latn-BA,smj-SE,ar-MA,en-IE,es-PA,fr-MC,sr-Latn-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-Latn-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,ar-KW,en-PH,es-CL,ar-AE,es-UY,ar-BH,es-PY,ar-QA,en-IN,es-BO,en-MY,es-SV,en-SG,es-HN,es-NI,es-PR,es-US,bs-Cyrl,bs-Latn,sr-Cyrl,sr-Latn,smn,az-Cyrl,sms,zh,nn,bs,az-Latn,sma,uz-Cyrl,mn-Cyrl,iu-Cans,zh-Hant,nb,sr,tg-Cyrl,dsb,smj,uz-Latn,mn-Mong,iu-Latn,tzm-Latn,ha-Latn,zh-CHS,zh-CHT

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