Ken*_*enn 0 c# iso cultureinfo region
我有一个从外部来源获取的 ISO 3166 两个字母国家/地区代码列表。对于每个,我创建
new System.Globalization.RegionInfo(countryCode)
Run Code Online (Sandbox Code Playgroud)
有时,其中一个无效,导致出现 ArgumentException“不支持区域性名称 'xx'”。
我想要一个函数来确定国家/地区代码在将其传递给构造函数之前是否有效。这是我的尝试:
private bool IsCultureValid(string cultureName)
{
return CultureInfo.GetCultures(CultureTypes.AllCultures)
.Any(c => c.Name.Equals(cultureName, StringComparison.InvariantCultureIgnoreCase));
}
Run Code Online (Sandbox Code Playgroud)
该函数对许多输入返回假阴性(函数返回 false,但如果我尝试,我可以使用该输入创建一个 RegionInfo 对象)。一些输入:
我缺少什么?这里有更好的方法吗?提前致谢!
我意识到这是一个过时的问题。然而,我最近遇到了类似的情况,我需要验证传入的 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));
}
Run Code Online (Sandbox Code Playgroud)
编辑:除非使用自定义文化,否则这实际上可以更直接地完成。只需使用“CultureTypes.SpecificCultures”枚举值即可。
| 归档时间: |
|
| 查看次数: |
8342 次 |
| 最近记录: |