CultureInfo.InvariantCulture in plain english

时间:2013-07-20 15:18:28

标签: c# datetime cultureinfo culture

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

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

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

3 个答案:

答案 0 :(得分:7)

  

使用InvariantCulture是否基本上意味着您明确定义了输入/显示的值(日期/数字/等)的文化?

没有。这只是一种有点像美国英语的文化,除了像货币符号这样的东西。它通常用于格式化/使用可被其他计算机而不是人类理解或生成的文本。

  

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

不,您会将相关的CultureInfo用于该文化。你可以也明确定义日期等的格式,但这是一个正交的问题。最好使用该文化的预定义标准格式之一,但如果没有一种符合您的需求,您可以始终明确。

答案 1 :(得分:5)

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

希望这有帮助

答案 2 :(得分:3)

特别关注DateTime,我可以提供的最佳建议是CultureInfo.InvariantCulture ParseExactToString,当您考虑到确切的格式时。 (如果您碰巧知道您的输入格式与不变文化的格式相匹配,您也可以将其与Parse一起使用,但我通常会避免这种情况。)

与用户交互时,请勿使用不变文化。

请记住,文化包含多个项目,包括日/月/年部分的排序,日期和时间部分分隔符,字符编码以及一周中几天的语言特定名称,月份年份,缩写包括上午/下午。

应该使用不变文化的一些例子:

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

何时应使用en-US

等特定文化的示例
  • 用户界面
  • 报告