CultureInfo简述
CultureInfo类位于System.Globalization命名空间内,这个类和这个命名空间许多人都不了解也认为不需要太多了解,实际上,你写的程序中会经常间接得使用这些类。
简单的说:当进行数字,日期时间,字符串匹配时,都会进行CultureInfo的操作,也就是不同的CultureInfo下,这些操作的结果可能会不一样。这里要介绍一下非常容易被忽视的InvariantCulture。
通过示例了解InvariantCulture
前面提到过,不同的CultureInfo会影响某些函数的执行结果,.NET中有一个特殊的CultureInfo:InvariantCulture,这个CultureInfo有点像英语格式,但它不和国家地区挂钩,它可以提供一个可靠的在多语言环境下的规范格式化。
比如你编写一个程序,要向数据中心服务器传递一些时间数据,你会怎么写?直接DateTime.ToString()?那你就大错特错了,下面用代码,举个非常形象的例子。在一个控制台里,模拟数据中心,然后放出多个线程,模拟客户端程序传递数据。
运行结果:
结果看到了吧,同样的DateTime.ToShortDateString(),在英语-美国,中文-中国,阿拉伯语-伊拉克和德语-德国的不同环境下,1990年10月27日竟然有如此不同的输出结果,这些数据让数据中心服务器情何以堪啊……
原因则已提到过,在进行日期时间输出时,.NET会考虑当前线程的CultureInfo,即Thread.CurrentThread.CurrentCulture(或者CultureInfo.CurrentCulture),并根据CultureInfo,进行相应地区文化的数据处理。注意不要和UICulture混淆。
解决方案就是使用这个特殊的InvariantCulture。
把输出代码改成
这样不管客户端运行在什么语言环境下,输出的时间格式都是统一的,方面数据中心服务器对数据做后续处理。
(当然这个例子仅用来演示InvariantCulture的用法,是否存在其他不妥处这里不做讨论)
InvariantCulture和字符串比较
下面代码进行四种字符串比较方法,分别是zh-cn, en-us文化,数值比较和InvariantCulture比较(全部是区分大小写)。
结果:
(下面全部是区分大小写)
Ordinal是传统比较方式,即比较每个字符的数值,如果相等的话,继续比较下一组,如果有一个没有的话,长度大的算大。
Invariant和大多数CultureInfo都用一种更人性化的比较方法。首先判断一组字符是否是不一样(这里不区分大小写),直接返回结果如果不一样,因此b>AB,B>abc。如果一样的话比较下一组,如果都一样则比较长度,所以abc>AB>ab,如果长度都一样最后再比较大小写,另外一个字符大写永远大于小写,所以AB>Ab>aB>ab
那么InvariantCulture这样比较字符串有什么作用呢?我觉得这样输出形式可读性更高,其实InvariantCulture比较字符串就是先进行一次不区分大小写的Ordinal比较(不过这里大写字母>小写字母),如果结果不相同的话在进行一遍区分大小写的Ordinal比较(同样这里也是大写字母>小写字母)。这样可以将字符串先进行一次大的筛选,然后再比较细节,看下面的示例,Ordinal和InvariantCulture的比较结果可读性更高!
结果:
结果显而易见,Ordinal机器式的纯数值比较,上面的Ordinal排序结果看起来还是很乱,而InvariantCulture则可读性更高。
总结
支持多种CultureInfo是整个.NET Framework更加人性化,因为这可以使同一个数据适应不同地区和文化,这样当然满足处于不同地区和文化的用户,但前提是数据给“人”看,如果这些数据用于计算机之间的传输,即给“机器”看,这样的多文化处理反而不妥,造成同一个数据的不同展现形式,尤其是读写两方的文化地区不同时,数据可能根本无法被正常读取或者产生潜在bug,因此这里,正是InvariantCulture的用武之地。
分享到:
相关推荐
利用P/Invoke获取更改后的系统CultureInfo
CultureInfo.txtCultureInfo.txtCultureInfo.txt
Format ( 1234.56 , CultureInfo . InvariantCulture )); 特征 按预期方式解析和格式化大多数自定义数字格式:十进制,百分比,千位,指数,小数,货币,日期/时间,持续时间,文本。 有条件支持多个部分。 使用...
2.有多个语言包也可以指定语言包,在程序中写入以下代码: System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-Hans"); System.Threading.Thread.CurrentThread...
尝试以下方法之一:将monthName设置为String = New DateTime(2012,08,30).ToString(“ MMM”,CultureInfo.InvariantCulture)希望对您有所帮助
原作者:mimihouse.info DevExpress 12.2.7 汉化包, ...System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN"); 汉化了好多项目,支持12.2.X系列 。
官方汉化包 亲测可用 下载地址为 ...使用方法: 解压缩到目录 ... 程序中调用 Application CurrentCulture new System Globalization CultureInfo "zh CN" ;">官方汉化包 亲测可用 下载地址为 ...
2、在主程序的program.cs中的main函数的最前面加入如下两行代码: System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN"); System.Threading.Thread.Current...
2、在主程序的program.cs中的main函数的最前面加入如下两行代码: System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN"); System.Threading.Thread.Current...
2、在主程序的program.cs中的main函数的最前面加入如下两行代码: System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN"); System.Threading.Thread.Current...
2、在主程序的program.cs中的main函数的最前面加入如下两行代码: System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN"); System.Threading.Thread.Current...
2、在主程序的program.cs中的main函数的最前面加入如下两行代码: System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN"); System.Threading.Thread.Current...
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN"); System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("zh-...
1、在网站根目录下新建App_GlobalResources文件夹,将全部*.resx文件解压到该目录中即可。现在测试一下,如果网页已经汉化,则下面的步骤可以省了;如果系统没有自动判断出语言环境,请使用下面的方法显式指定。 2、...
1、在网站根目录下新建App_GlobalResources文件夹,将全部*.resx文件解压到该目录中即可。现在测试一下,如果网页已经汉化,则下面的步骤可以省了;如果系统没有自动判断出语言环境,请使用下面的方法显式指定。 2、...
1、在网站根目录下新建App_GlobalResources文件夹,将全部*.resx文件解压到该目录中即可。现在测试一下,如果网页已经汉化,则下面的步骤可以省了;如果系统没有自动判断出语言环境,请使用下面的方法显式指定。 2、...
devexpress 14.2官方汉化文件,共4个文件:分别为zh-CN、zh-Hans、zh-Hant、zh-TW
DevExpress14.1的中文汉化包 使用: 解压的dll放入zh-CN文件夹中 Main函数中 System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN");
一、iso8601格式转换成DateTime对象 这里主要用到datetime的静态方法static datetime ParseExact(string s, ...$formatProvider = [Globalization.CultureInfo]::InvariantCulture [datetime]::ParseExact($dateTimeStr
DevExpress17.2 官方中文语言包 带源码 运行语言包,在执行目录... System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CHS"); Application.Run(new Form1()); }