我有一份从外部来源获得的ISO 3166双字母国家/地区代码列表。对于每一个,我创建
new System.Globalization.RegionInfo(countryCode)
偶尔会有一个无效导致ArgumentException“不支持文化名称'xx'。”
我想要一个函数来确定国家代码是否有效,然后再将其传递给构造函数。这是我的尝试:
private bool IsCultureValid(string cultureName)
{
return CultureInfo.GetCultures(CultureTypes.AllCultures)
.Any(c => c.Name.Equals(cultureName, StringComparison.InvariantCultureIgnoreCase));
}
该函数为许多输入返回一个假阴性(函数返回false,但是如果我尝试的话,我可以用该输入创建一个RegionInfo对象)。一些输入:
我错过了什么?这里有更好的方法吗?提前谢谢!
答案 0 :(得分:2)
我意识到这是一个过时的问题。但是,我最近碰到了类似的情况,我需要验证传入的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.SpecificCultures"枚举值。
答案 1 :(得分:1)
您可以编写一个在try / catch块中创建特定文化的函数,并返回CultureInfo对象而不是bool。
顺便说一句,对于墨西哥,洪都拉斯来说,没有像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.getcultures(v=vs.110).aspx
答案 2 :(得分:-1)
你因为不存在而变得虚假。 以下是通过以下循环获得的所有培养物的列表:
foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
ci.Name
}
AR,BG,CA,ZH-汉斯,CS,DA,DE,EL,EN,ES FI,FR,他,胡,是,它,JA,KO,NL,NO,PL,PT,RM ,RO,RU,小时,SK,平方,SV,TH,TR,UR,ID,英国,是SL等,LV,LT,TG,FA,VI,HY,AZ,欧盟,HSB,MK,TN ,XH,つ,AF,KA,FO,喜公吨,SE,GA,毫秒,KK,KY,SW,TK,UZ,TT,BN,PA,合谷,或,TA,TE,KN,毫升,如,MR,SA,MN,博时,CY,公里,卤味,GL,角,SYR,SI,IU,上午,TZM,NE,风云,PS,FIL,DV,哈,哟,QUZ,国家统计局,BA,磅,KL,IG,II ARN,MOH,BR ,,微克,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,他-IL,HU-HU,IS-IS,它-IT,JA-JP, KO-KR,NL-NL,NB-NO,PL-PL,PT-BR,RM-CH,滚装船,RU-RU,HR-HR,SK-SK,SQ-AL,SV-SE,TH- TH,TR-TR,UR-PK,ID-ID,UK-UA,是-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,祖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,或-IN,TA-IN,TE-IN,KN-IN,ML-IN,如-IN,MR-IN,SA-IN,MN-MN,博-CN,CY-GB,KM-KH, LO-LA,GL-ES,KOK-IN,SYR-SY,SI-LK,IU-罐-CA,AM-ET,NE-NP,FY-NL,PS-AF,FIL-PH,DV-MV, HA-LATN-NG,溜溜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-智商ZH-CN,DE-CH,EN-GB,ES-MX,FR-BE,它-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-旺-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,去LU,EN-CA,ES-GT,FR-CH,HR-BA,SMJ-NO,AR-DZ,ZH-MO,DE-LI,烯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,烯ZA,ES-DO,SR-Cyrl-BA, SMA-SE,AR-OM,烯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,烯ZW,ES-EC,SR-Cyrl- ME,AR-KW,烯PH,ES-CL,AR-AE,ES-UY,AR-BH,ES-PY,AR-QA,EN-IN,ES-BO,烯MY,ES-SV, EN-SG,ES-HN,ES-NI,ES-PR,ES-US,BS-Cyrl,BS-LATN,SR-Cyrl,SR-LATN,SMN,AZ-Cyrl,短信,ZH,NN,BS, AZ-LATN,SMA,UZ-Cyrl,MN-Cyrl,IU-制罐,ZH-汉特,NB,SR,TG-Cyrl,DSB,SMJ,UZ-LATN,MN-旺,IU-LATN,TZM-LATN, HA-LATN,ZH-CHS,ZH-CHT
所以你可以看到它不包含zw,但它有en-ZW类似于au它有en-AU