CultureInfo.InvariantCulture是什么意思?

时间:2012-03-18 16:54:27

标签: .net resharper

我有一串文字如下:

var foo = "FooBar";

我想声明第二个名为bar的字符串,并使其等于我的第一个foo的第一个和第四个字符,所以我这样做:

var bar = foo[0].ToString() + foo[3].ToString();

这可以按预期工作,但是ReSharper建议我将Culture.InvariantCulture放在括号内,所以此行最终会如此:

var bar = foo[0].ToString(CultureInfo.InvariantCulture)
        + foo[3].ToString(CultureInfo.InvariantCulture);

这是什么意思,它会影响我的程序运行方式吗?

5 个答案:

答案 0 :(得分:129)

并非所有文化都使用相同的日期和小数/货币值格式。

当您将作为字符串存储的输入值(读取)转换为DateTimefloatdouble或{{}时,这对您很重要1}}。如果您尝试将上述数据类型格式化为字符串(写入)以进行显示或存储,也会很重要。

如果您知道日期和小数/货币值将提前具体到哪种特定文化,则可以使用该特定decimal属性(即CultureInfo)。例如,如果您希望用户输入。

如果您要格式化或解析一个应该由一个独立于用户本地设置的软件解析的字符串,则使用CultureInfo("en-GB")属性。

默认值为CultureInfo.InvariantCulture,因此默认的CultureInfo取决于正在执行的操作系统设置。这就是为什么你应该总是确保文化信息符合你的意图(参见Martin's answer以获得一个好的指导原则。)

答案 1 :(得分:121)

当数字,​​日期和时间被格式化为字符串或从字符串解析时,文化用于确定如何完成。例如。在显性en-US文化中,您有以下字符串表示形式:

  • 1,000,000.00 - 一百万,两位数
  • 2013年1月29日 - 此发布日期

在我的文化(da-DK)中,值具有此字符串表示形式:

  • 1.000.000,00 - 一百万,两位数
  • 29-01-2013 - 此发布日期

在Windows操作系统中,用户甚至可以自定义数字和日期/时间的格式,也可以选择其他文化而不是其操作系统的文化。使用的格式是用户的选择,它应该是如何。

因此,当您使用ToStringString.Format格式化要向用户显示的值或使用DateTime.ParseDecimal.Parse从字符串解析时,默认值为使用CultureInfo.CurrentCulture。这允许用户控制格式。

然而,许多字符串格式化和解析实际上不是在应用程序和用户之间交换的字符串,而是在应用程序和某些数据格式(例如XML或CSV文件)之间交换的字符串。在这种情况下,您不想使用CultureInfo.CurrentCulture,因为如果使用不同的文化进行格式化和解析,它可能会中断。在这种情况下,您希望使用CultureInfo.InvariantCulture(基于en-US文化)。这可以确保值可以没有问题地往返。

ReSharper给你警告的原因是一些应用程序编写者不知道这种区别可能会导致意外的结果,但他们从未发现这一点,因为他们的CultureInfo.CurrentCultureen-US具有相同的行为为CultureInfo.InvariantCulture。但是,只要应用程序在另一种文化中使用,其中有可能使用一种文化进行格式化,另一种用于解析应用程序可能会破坏。

总结一下:

  • 如果要格式化或解析用户字符串,请使用CultureInfo.CurrentCulture(默认值)。
  • 如果要格式化或解析应该由某个软件解析的字符串,请使用CultureInfo.InvariantCulture
  • 很少使用特定的国家文化,因为用户无法控制格式化和解析的完成方式。

答案 2 :(得分:21)

根据微软的说法:

  

CultureInfo.InvariantCulture属性既不是中立也不是   特定的文化。这是第三种文化   文化不敏感。它与英语有关但是   不属于某个国家或地区。

(来自http://msdn.microsoft.com/en-us/library/4c5zdc6a(vs.71).aspx

所以InvariantCulture类似于培养“en-US”但不完全相同。如果你写:

var d = DateTime.Now;
var s1 = d.ToString(CultureInfo.InvariantCulture);   // "05/21/2014 22:09:28"
var s2 = d.ToString(new CultureInfo("en-US"));       // "5/21/2014 10:09:28 PM"

然后s1和s2将具有similair格式,但InvariantCulture添加前导零,“en-US”使用AM或PM。

因此,当您将日期保存到文本文件或解析数据时,InvariantCulture更适合内部使用。当您向最终用户提供数据(日期,货币......)时,指定的CultureInfo会更好。

答案 3 :(得分:4)

对于数字(小数点,数量上的逗号)之类的东西,它们通常是特定文化中的首选。

执行此操作的适当方法是将其设置为文化级别(对于德语),如下所示:

Thread.CurrentThread.CurrentCulture.NumberFormat = new CultureInfo("de").NumberFormat;

答案 4 :(得分:2)

JetBrains提供了一个合理的explanation,但如果我在一个我知道的网站上工作,我只会忽略这个建议。