【问题标题】:Country codes list - C#国家代码列表 - C#
【发布时间】:2010-11-22 09:10:53
【问题描述】:

我有一个字符串,我需要验证它是否是国家代码。文化是德国人。有没有我可以调用的方法来获取德国文化中的国家/地区代码列表,而无需自己输入所有 274 (?) 代码?

谢谢, 泰迦。

【问题讨论】:

    标签: c# internationalization country-codes


    【解决方案1】:

    如果您只需要国家/地区,您可以使用 RegionInfo 类: http://msdn.microsoft.com/en-us/library/system.globalization.regioninfo.aspx

    【讨论】:

      【解决方案2】:

      当您说“国家/地区代码”时,我假设您指的是 ISO 3166 中的两个字母代码。然后您可以使用 RegionInfo 构造函数来检查您的字符串是否是正确的代码。

      string countryCode = "de";
      try {
          RegionInfo info = new RegionInfo(countryCode);
      }
      catch (ArgumentException argEx)
      {
          // The code was not a valid country code
      }
      

      正如您在问题中所述,您还可以检查它是否是德语的有效国家/地区代码。然后你只需传入一个特定的文化名称和国家代码。

      string language = "de";
      string countryCode = "de";
      try {
          RegionInfo info = new RegionInfo(string.Format("{0}-{1}", language, countryCode));
      }
      catch (ArgumentException argEx)
      {
          // The code was not a valid country code for the specified language
      }
      

      【讨论】:

      • 事实证明,德国医疗保险使用不同的国家命名系统。国家代码大小从 1-3 个字符不等。不过感谢您的帮助! – Teja 0 秒前
      • 哇..这真的很奇怪。如果只有三个字母,我猜它是 ISO 3166-1 Alpha 3,它使用三个字母作为国家代码(DEU 代表德语)。
      • RegionInfo 不完全符合 ISO 3166。此列表有一些例外,例如 Cyprys (CY) 在 ISO 3166 列表中,但未被 RegionInfo 识别。
      【解决方案3】:

      http://cldr.unicode.org/ - 通用标准多语言数据库包括国家列表和其他可本地化的数据。

      【讨论】:

        【解决方案4】:

        接受的答案是对构造函数抛出的ArgumentException 的误用。您并没有真正使用RegionInfoArgumentException 实例,这使得代码的目的非常不清楚。

        取而代之的是,获取所有特定文化的列表,然后搜索这些文化的区域以在您的 ISO 3166 alpha-2 代码中找到匹配项:

        bool IsCountryCodeValid(string countryCode)
        {
            return CultureInfo
                .GetCultures(CultureTypes.SpecificCultures)
                    .Select(culture => new RegionInfo(culture.LCID))
                        .Any(region => region.TwoLetterISORegionName == countryCode);
        }
        

        或者具体来说,针对您的问题:

        bool IsValidGermanCountryCode(string countryCode)
        {
            return CultureInfo
                .GetCultures(CultureTypes.SpecificCultures)
                    .Where(culture => culture.TwoLetterISOLanguageName == "de")
                        .Select(culture => new RegionInfo(culture.LCID))
                            .Any(region => region.TwoLetterISORegionName == countryCode);
        }
        

        【讨论】:

        • 显然这使用了 LINQ。
        【解决方案5】:

        使用 RegionInfo 检查有效的 ISO 代码时要小心。如果您提供的代码有效并且它是受支持的区域,它将返回一个区域,但它不会对所有有效的 ISO 3166 代码执行此操作。

        查看这里以获得更完整的解释:https://social.msdn.microsoft.com/Forums/en-US/c9a8bc14-d571-4702-91a6-1b80da239009/question-of-regioninfo-and-region-cy

        RegionInfo 适用于欧洲,但有几个非洲国家未使用此方法进行验证(例如乌干达)。

        【讨论】:

          【解决方案6】:

          你可以使用我的 nuget 包Nager.Country。每个国家/地区都有很多附加信息。欲了解更多信息,请访问Github project

          PM> install-package Nager.Country
          
          var countryCode = "de";
          ICountryProvider countryProvider = new CountryProvider();
          var countryInfo = countryProvider.GetCountry(countryCode);
          if (countryInfo != null)
          {
              //country exists
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-01-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-10-16
            相关资源
            最近更新 更多