.NET:InvariantCulture和en-US之间有什么区别吗?

33

给定以下两种文化:

CultureInfo c1 = InvariantCulture;
CultureInfo c2 = new CultureInfo("en-US");

假设我要检查与两种文化有关的每一条具体信息,例如:

c1.DateTimeInfo.ShortDatePattern;
c2.DateTimeInfo.ShortDatePattern;

c1.DateTimeInfo.LongDatePattern;
c2.DateTimeInfo.LongDatePattern;

c1.NumberFormat.CurrencyDecimalDigits;
c2.NumberFormat.CurrencyDecimalDigits;

c1.TextInfo.IsRightToLeft;
c2.TextInfo.IsRightToLeft;

我会找到任何区别吗?

换句话说,InvariantCulture 在所有情况下是否与 "en-US" 文化相同?


1
你只是出于好奇问这个问题吗?每个文化都有特定的用例,这些用例已经被明确定义。无论它们是否相同,都与编写软件的过程无关。 - Jeffrey L Whitledge
我之所以问这个问题,是因为我想知道当我真的不知道使用哪种文化时,是否可以使用InvariantCulture。如果我正在尝试解析日期、货币值或数字,我不知道它属于哪种文化。即使在en-US中,也有许多不同的日期书写方式。我怎么知道对方指的是en-US的哪个子文化呢?所以通过询问它们之间的差异,我想看看我能多经常地使用InvariantCulture,而不是强制使用CurrentThreadCulture、CurrentUICulture或CurrentCulture。 - Ian Boyd
3
我建议不要试图逃避任何事情。当前的文化应该用于一切不需要跨机器或文化变化不变的事物。如果你试图解析你无法控制并且与当前文化不匹配、没有符合特定格式或者没有标注用来创建它的文化的数据,那么也许应该考虑用户可选择文化或其他解决方法。我认为Invariant不能帮助你。 - Jeffrey L Whitledge
6个回答

44

可以。

例如:InvariantCulture在格式化货币时使用国际符号“¤”,而不是美元符号“$”。

但大部分情况下,它们非常相似。


7
引用 MSDN 的说法:“InvariantCulture 属性既不代表中性文化,也不代表特定文化。它代表一种与文化无关的第三种文化类型。它与英语语言相关联,但不与任何国家或地区相关联。”因此,大多数情况下使用英文是有意义的(尽管对于奇怪的美国日期格式,我希望能看到一些合理的东西),但货币单位将会是无意义的 :) - Joey
1
糟糕。尝试使用InvariantCulture解析货币字符串在世界任何地方都行不通。 - Ian Boyd
4
@IanBoyd,这其实是一件好事。这样就不会有人错误地尝试使用InvariantCulture来解析本地货币字符串了。真正让InvariantCulture没用的是尴尬的“M/d/yyyy”格式,而不是常规的“yyyy-MM-dd”格式。 - Sasha

5

实际上有一些差别(在Watch窗口中检查两个值),但最相关的区别是意图。InvariantCulture表明您希望以与文化无关且与英语相关的方式解析某些数据,而en-US声明了您实际想要以美国特定的方式解析数据。


4

好的,如果你看一下你的代码片段可能会产生什么:

CultureInfo c1 = CultureInfo.InvariantCulture;
CultureInfo c2 = new CultureInfo("en-US");

Console.WriteLine( c1.DateTimeFormat.ShortDatePattern.ToString());
Console.WriteLine( c2.DateTimeFormat.ShortDatePattern.ToString());

Console.WriteLine( c1.DateTimeFormat.LongDatePattern.ToString());
Console.WriteLine( c2.DateTimeFormat.LongDatePattern.ToString());

Console.WriteLine( c1.NumberFormat.CurrencyDecimalDigits.ToString());
Console.WriteLine( c2.NumberFormat.CurrencyDecimalDigits.ToString());

Console.WriteLine( c1.TextInfo.IsRightToLeft.ToString());
Console.WriteLine( c2.TextInfo.IsRightToLeft.ToString());

您会看到一些区别:

MM/dd/yyyy
M/d/yyyy
dddd, dd MMMM yyyy
dddd, MMMM dd, yyyy
2
2
False
False

想一想,当美国失去其骨干并决定开始使用欧洲风格的日期或转换为公制系统(公制系统是撒旦的工具!我的汽车每40个罗得可以行驶到猪头桶,我就喜欢这样!)时,InvariantCulture 可以保持原样,并且仍然可以顺利运作。因此,您在使用InvariantCulture以文本形式存储的所有日期将继续正常工作...


3
“考虑数据的意图非常重要。如果您正在序列化,请确保使用InvariantCulture。

请参阅:http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.aspx

来自Microsoft文档:

动态文化数据

除了不变文化之外,文化数据是动态的。即使是预定义的文化也是如此。...

注意

在保存数据时,应用程序应该使用不变的文化,使用二进制格式或使用特定于文化的独立格式。根据与特定文化相关联的当前值保存的数据(而不是不变文化)可能会变得无法读取或者如果该文化发生变化,则可能会改变其含义。

我最近刚遇到这个问题,用户将区域和语言设置为英语(美国),但选择了他的个人日期格式为dd-MMM-yy。他收到了一个默认的en-US格式“4/29/2010 1:45:30 PM”的客户项目和代码:


这段代码抛出异常是因为他的本地偏好覆盖了典型的en-US格式。该代码的作用是将customValue转换为DateTime类型,并使用en-US特定文化信息进行转换。

1

简短的回答是肯定的。InvariantCulture 是它所说的,不是特定的文化。它是英语,但不属于特定的地区。

您可以在此处阅读更多信息:MSDN


0

我知道它们有不同的CultureNameLCID(请参见this list)。

此外,货币符号也不同 - InvariantCulture为¤,en-US为$。

来自InvariantCulture

在需要Culture的全球化命名空间中,几乎可以使用它。

这表明它们在大部分情况下是可互换的。但是,名称确实说明了意图,因此在使用CultureInfo时应考虑到这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接