【问题标题】:CultureInfo.InvariantCulture in plain englishCultureInfo.InvariantCulture 简单的英语
【发布时间】:2013-07-20 15:18:27
【问题描述】:

我知道日期/数字的文化规则足以写一本书,但我想我有一个简单的问题..

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

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

【问题讨论】:

标签: c# datetime cultureinfo culture


【解决方案1】:

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

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

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

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

【讨论】:

  • 啊好吧..所以使用相关的 CultureInfo,然后在需要时显式覆盖它?谢谢你的回答..
  • @user982119:您不会覆盖文化 - 您在必要时明确指定 格式。你明白你可以指定both,对吧?
  • 你能给我举个例子吗?在哪里指定两者,正如你的意思,是必要的/有用的..
  • @user982119:当然——假设你想指定“用星期几格式化日期,在这种文化中”你可以使用dateTime.ToString("dddd dd MMMM yyyy", someCulture)
【解决方案2】:

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

希望对你有帮助

【讨论】:

  • 那么 InvariantCulture 给了你更多的控制权?尽管不允许用户做出决定
  • 没错。不变的文化是无法改变的。所以用户无法决定。
【解决方案3】:

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

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

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

何时应该使用不变文化的一些示例:

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

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

  • 用户界面
  • 报告

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多