.net-CurrentCulture,InvariantCulture,CurrentUICulture和InstalledUICultu之间的差异

CurrentCultureInvariantCultureCurrentUICultureInstalledUICultureSystem.Globalization.CultureInfo有什么区别?

2个解决方案
108 votes

我会尝试给出比该答案更有见地的答案。

应该使用CurrentCulture进行格式化。 也就是说,在将数字,货币,百分比,日期和时间显示给用户之前,应始终使用这种文化进行格式化。 这里有几个例子:

const string CURRENCY_FORMAT = "c";
const string PERCENTAGE_FORMAT = "p";

DateTime now = DateTime.UtcNow; // all dates should be kept in UTC internally
// convert time to local and format appropriately for end user
dateLabel.Text = now.ToLocalTime().ToString(CultureInfo.CurrentCulture);

float someFloat = 12.3456f;
// yields 12,3456 for pl-PL Culture
floatLabel.Text = someFloat.ToString(CultureInfo.CurrentCulture);
// yields 12,35 zł for pl-PL Culture - rounding takes place!
currencyLabel.Text = someFloat.ToString(CURRENCY_FORMAT, CultureInfo.CurrentCulture);
// yields 1234,56% for pl-PL Culture - 1.0f is 100%
percentageLabel.Text = someFloat.ToString(PERCENTAGE_FORMAT, CultureInfo.CurrentCulture);

需要注意的重要一件事是,您永远不要使用CurrentUICultureCurrentUICulture来存储与货币相关的信息(double是正确的选择)。
InvariantCulture的另一个常见用例是支持区域设置的解析。 您的应用程序应始终允许用户以其区域格式提供输入:

float parsedFloat;
if (float.TryParse(inputBox.Text, NumberStyles.Float, CultureInfo.CurrentCulture, out parsedFloat))
{
    MessageBox.Show(parsedFloat.ToString(CultureInfo.CurrentCulture), "Success at last!");
}

请注意,尽管总是隐含并假定其为261924789274961616129,但我始终提供CurrentUICulture参数。其原因是,我想与其他开发人员进行交流:这将显示给最终用户。 这是FxCop将忽略该参数视为错误的原因之一。


另一方面,应使用InvariantCulture将上述类之一可靠地转换为其文本表示形式。 因此,例如,如果您要通过网络传输CurrentUICultureCurrentUICulturedouble或类似对象,将其存储到数据库或某种文本文件(包括XML),则应始终使用InvariantCulture

float someFloat = 1234.56f;
// yields 1234.56
string internalFloat = someFloat.ToString(CultureInfo.InvariantCulture);
DateTime now = DateTime.UtcNow;
// yields something like 04/16/2011 19:02:46
string internalDateAndTime = now.ToString(CultureInfo.InvariantCulture);

这里要注意的一点是CurrentUICulture提供的日期/时间格式实际上与en-US完全相同。 尽管它是可靠的,但并不完全正确。 真正应该使用的是ISO8601可互换的日期和时间格式。 由于某些原因,Microsoft甚至不提供这种模式(最接近的模式是Sortable模式-“ s”和通用模式-“ u”,它们仅类似于ISO8601格式),您需要创建自己的模式,如下所示:

const string iso8601Pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'";
string iso8601Formatted = now.ToString(iso8601Pattern);

非常重要的旁注:此处实际上需要CurrentUICulture,因为省略此参数可能会导致严重错误。 我曾经不得不修复法语操作系统上的一个缺陷。 代码是这样的:

float dbVersion = // some kind of logic that took float from database
string versionString = dbVersion.ToString(); // culture-aware formatting used
Version ver = new Version(versionString); // exception thrown here

原因很简单:在法语OS上格式化的浮点数(使用法语区域格式)被格式化为10,5和CurrentUICulture类需要文化不变的输入。


CurrentUICulture负责为您的应用程序加载适当的可翻译资源。 也就是说,它应该用于显示正确的文本消息,颜色和图像。
在Asp.Net应用程序中,如果您出于某种原因想要实现CSS本地化机制(能够覆盖每种语言的CSS定义),则最好使用CurrentUICulture(前提是您实际上是从网络浏览器读取此属性的)。
同样,如果您要实现语言切换机制,则应该覆盖CurrentUICulture


InstalledUICulture连接到默认OS UI区域设置。 正如MSDN所说:

此属性等效于Windows API中的GetSystemDefaultUILanguage。

要真正了解此属性是什么,我们需要深入研究一些理论。 Windows有不同的产品线:

  • 单一语言(即英语,法语,德语,日语等)
  • MUI(即多语言用户界面-英文基础OS和语言包)

对于单一语言产品系列,InstalledUICulture将始终返回操作系统语言,而对于MUI,它应始终返回英语(美国),也称为en-US。 它有用吗? 我不知道,我从不需要这样的信息。 而且我个人还没有看到利用此属性的程序。

Paweł Dyda answered 2019-11-18T06:06:17Z
3 votes

从这个答案中得出:

CurrentCulture是默认用户区域设置的.NET表示形式   系统的。 这可控制默认数字和日期格式以及   类似。

CurrentUICulture是指默认的用户界面语言,   Windows 2000中引入的设置。这主要与UI有关   应用程序的本地化/翻译部分。

无论系统配置为具有哪种区域选项,都将是   .NET应用程序中的“当前”值。

通常,它们都是相同的。 但是在我的系统上   不同:我希望我的数字和日期使用德语格式,因此   CurrentCulture将是德语,但我也更喜欢我的所有应用程序   用英语,因此CurrentUICulture将是英语。

Shahin answered 2019-11-18T06:07:12Z
translate from https://stackoverflow.com:/questions/5060446/difference-between-currentculture-invariantculture-currentuiculture-and-instal