不变量文化是什么意思?

2024-05-15 08:02:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一串这样的文字:

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);

这意味着什么,它会影响我的程序运行吗?


Tags: 字符串声明foovarbar字符建议括号
3条回答

当数字、日期和时间格式化为字符串或从字符串中解析时,使用区域性来确定如何执行。E、 g.在主要的en-US区域性中,有以下字符串表示:

  • 1000000.00-一百万,带两位小数
  • 2013年1月29日-发布日期

在我的区域性(da-DK)中,值具有以下字符串表示:

  • 1000.000,00-一百万,带两位小数
  • 2013年1月29日-发布日期

在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
  • 很少使用特定的民族文化,因为用户无法控制格式化和解析的方式。

并非所有区域性对日期和十进制/货币值使用相同的格式。

当您将存储为字符串的输入值转换为DateTimefloatdoubledecimal时,这对您很重要。如果您试图将上述数据类型格式化为字符串(write)以供显示或存储,这也很重要。

如果您提前知道日期和十进制/货币值将在哪个特定区域性中,则可以使用该特定的CultureInfo属性(即CultureInfo("en-GB"))。例如,如果您希望用户输入。

如果正在格式化或解析一个字符串,则使用CultureInfo.InvariantCulture属性,该字符串应由一个独立于用户本地设置的软件解析。

默认值是CultureInfo.InstalledUICulture,因此默认的CultureInfo取决于执行操作系统的设置。这就是为什么您应该始终确保区域性信息符合您的意图(请参见Martin's answer以获得良好的指导原则)。

据微软称:

The CultureInfo.InvariantCulture property is neither a neutral nor a specific culture. It is a third type of culture that is culture-insensitive. It is associated with the English language but not with a country or region.

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

因此,不变性文化与文化“我们”相似,但并不完全相同。如果你写:

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将具有相似的格式,但是不变量区域性添加前导零,“en-US”使用AM或PM。

因此,当您将日期保存到文本文件或分析数据时,不变量区域性更适合内部使用。当您向最终用户显示数据(日期、货币…)时,指定的CultureInfo更好。

相关问题 更多 >