This article is currently in the process of being translated into Chinese (~92% done).
The RegionInfo class
上一节的主题是CultureInfo类,也讨论了部分国家/地区的内容,不过还可以做更多基于地区的设置,使用System.Globalization名空间内的另一个类:RegionInfo类。此类包含很多与特定地区(通常为国家)相关的有用信息,如,其货币的名称和符号,是否使用公制系统等等。
获取RegionInfo实例
要访问地区信息,就需要一个RegionInfo类实例。此类有一个构造器,需要一个ISO 3166代码或该地区的语言代码/地区-国家代码(如,“en-US”)。例如:
RegionInfo regionInfo = new RegionInfo("en-US");
Console.WriteLine(regionInfo.EnglishName);这也表示如果已经有了一个CultureInfo类实例,就可以使用此信息来确保获得的是对应的RegionInfo实例。如上节所述,程序中总会有个默认的CultureInfo实例可用:
RegionInfo regionInfo = new RegionInfo(CultureInfo.CurrentCulture.Name);
Console.WriteLine(regionInfo.EnglishName);
基于这一点,下面介绍一些RegionInfo类有用的功能。
RegionInfo类的重要属性
上面已经试了下EnglishName属性 - 只是简单地以英语返回地区的名称。不过当然还有更多很有用的属性 - 例如几个与货币相关的属性:
RegionInfo regionInfo = new RegionInfo("sv-SE");
Console.WriteLine(regionInfo.CurrencySymbol);
Console.WriteLine(regionInfo.ISOCurrencySymbol);
Console.WriteLine(regionInfo.CurrencyEnglishName);
Console.WriteLine(regionInfo.CurrencyNativeName);使用CurrencySymbol,ISOCurrencySymbol,CurrencyEnglishName和/或CurrencyNativeName,可以获得与货币相关的输出信息。结果象这样(本例针对的是瑞典语/瑞典):
kr
SEK
Swedish Krona
Svensk krona还很容易确认指定地区是否使用公制系统,使用IsMetric属性:
RegionInfo regionInfo = new RegionInfo(CultureInfo.CurrentCulture.Name);
Console.WriteLine("Is the metric system used in " + regionInfo.EnglishName + "? " + (regionInfo.IsMetric ? "Yes" : "No"));然后就是一系列的标识类属性:
- Name会返回ISO 3166代码,标识语言和国家/地区,如,“en-US”_指英语/美国。
- DisplayName会返回在本地化.NET framework版本下的国家/地区全名。
- EnglishName会用英语返回国家/地区的全名。
- NativeName会用指定的语言返回国家/地区的全名,如,en-US返回“United States”或de-DE返回"Deutschland"。
- TwoLetterISORegionName会返回国家/地区双字母的ISO 3166代码,如,美国返回“US”,德国返回“DE”。
- ThreeLetterISORegionName会返回国家/地区三字母的ISO 3166代码,如,美国返回“USA”,德国返回“DEU”。
显然要显示国家/地区的信息时使用这些属性非常方便,后面的例子会展示这一点。
使用RegionInfo获取国家列表
上一节展示过如何取得一份.NET framework中定义的所有文化的列表,基本上就是一份语言-国家/地区的综合信息。可以把该信息与RegionInfo类结合以获取国家/地区列表:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
namespace RegionInfoCountries
{
class Program
{
static void Main(string[] args)
{
CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
List<RegionInfo> countries = new List<RegionInfo>();
foreach (CultureInfo ci in cultures)
{
RegionInfo regionInfo = new RegionInfo(ci.Name);
if (countries.Count(x => x.EnglishName == regionInfo.EnglishName) <= 0)
countries.Add(regionInfo);
}
foreach (RegionInfo regionInfo in countries.OrderBy(x => x.EnglishName))
Console.WriteLine(regionInfo.EnglishName);
}
}
}此例子比本节其它例子长一点,下面是详细讲解。程序开始获取了一份可用的,特定文化列表 - 上一节介绍过,特定文化是指定义了语言和地区/国家的文化。通过循环遍历此列表,在每一次循环中,使用CultureInfo实例生成一个对应的RegionInfo实例。然后检查该名称的国家是否已经加入到列表,如果没有,则加入到列表。循环结束后就获得了一份.NET framework内定义的完整国家列表,可以通过循环遍历把它们全部输出到控制台,或是去做几乎所有可能想象到的任何事。
这是一个展示对CultureInfo和RegionInfo综合使用的好例子,不过要强调一下,这并非是一个完整且精确的国家列表。这只是一份当前环境所用的 .NET framework版本中定义的全部国家的列表,也就是说自该版本发布后,有的国家可能已经消失或已经改名。因此,如果需要一个百分百精确的最新国家列表,应该自己建立并维护一份这样的列表。
总结
RegionInfo类基本上属于CultureInfo类的扩展,提供了更多关于特定国家/地区有用的信息。包括特定地区的标识和货币,还能提供一份国家/地区列表。