3

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

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

如果应用程序是为一种且只有一种文化的受众构建的,那么使用 InvariantCulture 并定义您希望每次如何输入/显示值是否有意义?

4

3 回答 3

9

使用 InvariantCulture 基本上是否意味着您明确定义值(日期/数字/其他)将被输入/显示为什么文化?

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

如果应用程序是为一种且只有一种文化的受众构建的,那么使用 InvariantCulture 并定义您希望每次如何输入/显示值是否有意义?

不,您会使用与CultureInfo该文化相关的内容。您还可以明确定义日期等的格式,但这是一个正交问题。最好为该文化使用一种预定义的标准格式,但如果这些格式都不符合您的需求,您可以始终明确。

于 2013-07-20T15:21:38.510 回答
6

InvariantCulture独立于任何文化或任何因素。例如,如果您使用 new 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

希望这可以帮助

于 2013-07-20T15:42:10.337 回答
5

关于. DateTime_ _ _ (如果您碰巧知道您的输入格式与不变文化的格式匹配,您也可以使用它,但我通常会避免这种情况。)CultureInfo.InvariantCultureParseExactToStringParse

与用户交互时不要使用不变的文化。

请记住,文化包含多个项目,包括日/月/年部分的顺序、日期和时间部分分隔符、字符编码以及一周中的日期、一年中的月份的特定语言名称, 以及包括 am/pm 在内的缩写。

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

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

何时应使用特定文化的一些示例,例如en-US

  • 用户界面
  • 报告
于 2013-07-20T17:24:54.887 回答