c# - 如何检测CurrentCulture是否被用户自定义?

标签 c# .net cultureinfo regional-settings currentculture

我想知道如何确定 CultureInfo.CurrentCulture 返回的 CultureInfo 实例是否具有所有默认值,或者是否已由用户自定义。

我已经使用以下 LINQPad 代码段和 LINQPad 命令行运行程序进行了一些测试。

var ci = CultureInfo.CurrentCulture;
var dtf = ci.DateTimeFormat;

ci.Name.Dump("CultureInfo");
dtf.FullDateTimePattern.Dump("FullDateTimePattern");
dtf.LongDatePattern.Dump("LongDatePattern");
dtf.LongTimePattern.Dump("LongTimePattern");

我在区域对话框中选择英语(南非)作为我的格式,我的代码片段报告如下。

E:\Junk>lprun CurrentCulture.linq
CultureInfo: en-ZA
FullDateTimePattern: dd MMMM yyyy hh:mm:ss tt
LongDatePattern: dd MMMM yyyy
LongTimePattern: hh:mm:ss tt

然后我将长日期格式更改为隐藏当天的前导零,并将长短时间更改为 24 小时制。该代码段现在报告了这一点。

E:\Junk>lprun CurrentCulture.linq
CultureInfo: en-ZA
FullDateTimePattern: d MMMM yyyy HH:mm:ss
LongDatePattern: d MMMM yyyy
LongTimePattern: HH:mm:ss

虽然区域性名称保持不变,但我更改的属性向我展示了新值。

我的问题是是否有一个属性或方法可以告诉我 CurrentCulture 返回的文化是否已从其默认值(在本例中为 en-ZA)更改。我认为 CultureInfo.UseUserOverride 可能是该属性,但在任何一种情况下它都会返回 true。

最佳答案

您不能询问文化是否已被用户更改,但您可以请求用户未更改的文化。

new CultureInfo(CultureInfo.CurrentCulture.Name, false);

CultureInfo::GetCultureInfo(CultureInfo.CurrentCulture.Name);

在其中任何一个中,UseUserOverrides 属性都将为 false。

只有默认区域性可以让其数据被用户覆盖。管理员可以通过安装自定义替换区域性来覆盖任何区域性中的数据。您可以通过检查 CultureTypes 属性是否存在 CultureTypes.ReplacementCultures 标志来检测到这一点。在这种情况下无法获取原始数据。

请注意,如果您实际上是在尝试编写基于此更改其行为的代码,那么您编写的代码可能会被 future 的版本破坏。由于修复了错误,数据在不同版本之间确实发生了变化。

关于c# - 如何检测CurrentCulture是否被用户自定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21280754/

相关文章:

c# - 将带有符号的货币转换为十进制

c# - 在 C# 中从 PEM ed25519 获取公钥和私钥

c# - 在实体中模拟 ICollection 属性

c# - 保持两个线程之间的 bool 值同步

.net - Powershell 和覆盖比较运算符

c# - 在 CultureInfo 中获取当前语言

.NET DateTime.ToString() - 默认格式设置

c# - 网线从网络适配器断开时如何获取套接字状态

c# - 设置单元测试以使用 Unity 测试 Controller

.net - 将 SSRS .RDL 渲染为 PDF 并打开它