我知道日期/数字的区域性规则对于整本书来说已经足够了,不过我想我有一个简单的问题。。
使用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
用于ParseExact
和ToString
。(如果你碰巧知道你的输入格式与不变区域性的格式匹配,你也可以将它与Parse
一起使用,但我通常会避免这种情况。)
在与用户交互时不要使用不变的区域性。
请记住,区域性包含多个项目,包括日/月/年部分的顺序、日期和时间部分分隔符字符、字符编码以及特定于语言的名称(一周中的几天、一年中的几个月)以及缩写(包括上午/下午)。
关于何时应该使用不变区域性的一些示例:
- 磁盘上的文件,尤其是预定义格式的文本文件
- 外部API,尤其是JSON或XML
- 单元测试,除非您专门测试区域性问题
一些应该使用特定区域性的示例,如en-US
:
- 用户界面
- 报告