CultureInfo.InvariantCulture in plain english



我知道日期/数字的区域性规则对于整本书来说已经足够了,不过我想我有一个简单的问题。。

使用InvariantCulture基本上意味着你明确定义了值(日期/数字/其他)将被输入/显示为什么区域性吗?它是否覆盖任何其他区域性设置(例如用户代理的设置)?

如果一个应用程序是为一种文化的受众构建的,那么使用InvariantCulture并定义每次输入/显示值的方式有意义吗?

使用InvariantCulture基本上意味着你明确定义了值(日期/数字/其他)将被输入/显示为什么区域性吗?

没有。这只是一种有点像美国英语的文化,除了货币符号之类的一些东西。它通常用于格式化/消费由另一台计算机而非人类理解或生成的文本。

如果一个应用程序是为一种文化的受众构建的,那么使用InvariantCulture并定义每次输入/显示值的方式有意义吗?

不,您将使用该区域性的相关CultureInfo也可以显式定义日期等的格式,但这是一个正交问题。对于这种文化,最好使用一种预定义的标准格式,但如果这些格式都不能满足您的需求,您可以始终保持明确。

InvariantCulture独立于任何文化或任何因素的。例如,如果您使用新的CultureInfo("en-US"),它将为您提供美国英语文化(可能不是实际的US English Culture,因为操作系统为您提供了在控制面板中更改这些设置的选项),如果应用了任何自定义格式,它将返回修改后的"en-US"文化"版本。

换言之,InvariantCulture将始终为您提供一种跨系统永远无法改变的文化。

<小时>假设您想要序列化某个值(比如double)并将其传递给另一个应用程序或在不同区域性中运行的其他线程,这会导致严重的问题。

考虑以下代码

Thread.CurrentThread.CurrentCulture = new CultureInfo("fr");
double source = 455.62d;
string serialized = source.ToString();//455,62 since `, is the decimal seperator` in "fr"
Thread t = new Thread((x) =>
{
    double deserialized = double.Parse(((string)x));
    Console.WriteLine(string.Format("Deserialized value is {0}", deserialized));//outputs 45562 
});
t.CurrentCulture = new CultureInfo("en-US");
t.Start(serialized);

数字更重要,对吧?考虑这个字符串表示AccountBalance

希望这能帮助

关于DateTime,我能给出的最好建议是,当您有确切的格式时,将CultureInfo.InvariantCulture用于ParseExactToString。(如果你碰巧知道你的输入格式与不变区域性的格式匹配,你也可以将它与Parse一起使用,但我通常会避免这种情况。)

在与用户交互时不要使用不变的区域性。

请记住,区域性包含多个项目,包括日/月/年部分的顺序、日期和时间部分分隔符字符、字符编码以及特定于语言的名称(一周中的几天、一年中的几个月)以及缩写(包括上午/下午)。

关于何时应该使用不变区域性的一些示例:

  • 磁盘上的文件,尤其是预定义格式的文本文件
  • 外部API,尤其是JSON或XML
  • 单元测试,除非您专门测试区域性问题

一些应该使用特定区域性的示例,如en-US:

  • 用户界面
  • 报告

相关内容

  • 没有找到相关文章

最新更新