This article is currently in the process of being translated into Chinese (~87% done).
Application Culture & UICulture
如上一章所述,处理文化差异非常重要,尤其涉及日期和数字的部分。因此,应用程序都会保持一个CultureInfo实例,并把其定义为“CurrentCulture(当前文化)” - 作为所有未指定特定文化的操作,如输出数字时的默认值。除非改变了此定义在CultureInfo 类上的设置,否则其值总是与当前操作系统所用的文化设置保持一致。以下是一个简单的检查方法:
Console.WriteLine("Current culture: " + CultureInfo.CurrentCulture.Name);
本章一直都会用到CultureInfo类,因此别忘了用using把其引入,如本例顶部所示。
上例会输出应用程序使用的文化设置,如“en-US”,表示运行在美国地区的语言为英语的计算机。如果生活在德国,计算机使用德语,输出结果就会变成“de-DE”。换言之,前两个字母表示语言,后两个字母表示国家或地区。
不过,很可能会需要进一步控制程序所用的文化配置。比如,如果程序的所有部分都使用英语,那么仅仅因为用户更改了计算机配置就以德国或是瑞典的格式来输出数字合理吗?也许是合理的,但如果不是呢,这也很容易处理,只需设置一个新的默认/回滚文化配置即可,还是使用CurrentCulture属性:
CultureInfo.CurrentCulture = new CultureInfo("en-US");
Console.WriteLine("Current culture: " + CultureInfo.CurrentCulture.Name);
float largeNumber = 12345.67f;
Console.WriteLine("Number format (Current culture): " + largeNumber.ToString());
CultureInfo germanCulture = new CultureInfo("de-DE");
Console.WriteLine("Number format (German): " + largeNumber.ToString(germanCulture));
上例通过把文化设置为en-US覆盖了系统的CurrentCulture属性。示例接下来把新设置的文化设置输出,之后又输出了一个大的浮点数字。如果运行此代码就会看到,数字是以英语的格式输出的。后几行代码展示了当然可以覆盖默认的文化设置,在ToString()方法中输入另一个CultureInfo实例 - 此时数字就会以德语格式输出了。此示例的输出类似这样:
Current culture: en-US
Number format (Current culture): 12345.67
Number format (German): 12345,67CurrentCulture与CurrentUICulture比较
CultureInfo类还有一个属性CurrentUICulture。此属性只与使用资源文件来本地化用户界面相关- 程序会根据CurrentUICulture属性决定加载那个版本的资源文件。除此之外的其它功能,包括数字,日期的格式化等等,都应该使用CurrentCulture属性。
CurrentCulture与线程
本教程还没有正式开始介绍线程,不过它们基本上就是允许程序同时做几件事的概念。.NET程序启动时会生成一个线程,除非使用.NET framework提供的众多多线程方案之一明确地建立了新的线程,否则就会一直只使用此线程。此处提到线程是因为它与程序的文化设置回滚很有关系。实际上,CultureInfo.CurrentCulture基本上只是Thread.CurrentThread.CurrentCulture属性的简写,表示定义的CurrentCulture都只对当前线程有效。
在.NET framework 4.5版本之前,对每个新建立的线程都必需手工进行文化设置。不过,在.NET 4.5中引入了CultureInfo.DefaultThreadCurrentCulture属性。设置了此属性后,新建立的线程都会使用此属性,与使用CurrentCulture属性一样方便:
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");不过已有的线程怎么办呢?其实,如果尚未为其CurrentCulture重新定义文化,则设置给DefaultThreadCurrentCulture的属性值也会设置给CurrentCulture属性。换言之,如果准备使用多线程,那就用DefaultThreadCurrentCulture替代CurrentCulture - 那样就都没有问题了。
总结
通过使用CultureInfo.CurrentCulture 和/或CultureInfo.DefaultThreadCurrentCulture属性,可为程序设置默认的文化配置 - 用于所有的数字和日期输出的格式化,除非每次都覆盖此值。