获取用户文化,而不是线程文化

use*_*499 3 .net c# vb.net winforms

当我的应用程序启动时,它会设置自己的文化,CultureInfo.InvariantCulture但在某些地方,我想根据用户在 Windows 中设置的内容使用本地化的数字格式。我怎样才能做到这一点? System.Globalization.CultureInfo.CurrentCulture只返回不再是用户默认的线程文化。

我希望有一种更优雅的方式,而不是在更改它之前存储线程的默认文化或创建一个新线程只是为了从中读取文化。

也许 Windows 功能有一个内置的 .Net 包装器GetUserDefaultLocaleName

Rez*_*aei 5

System.Globalization.CultureInfo有一个名为的内部属性UserDefaultCulture,它与GetUserDefaultLCID().NET 源代码中注释的 Win32 等效:

//
// This is the equivalence of the Win32 GetUserDefaultLCID()
//
internal static CultureInfo UserDefaultCulture
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用它以这种方式获取用户默认文化:

var property = typeof(System.Globalization.CultureInfo).GetProperty("UserDefaultCulture",
    System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
var culture = (System.Globalization.CultureInfo)property.GetValue(null);
Run Code Online (Sandbox Code Playgroud)

作为另一种选择,您可以创建一个新线程并使用其CurrentCulture属性:

var culture = new System.Threading.Thread(() => { }).CurrentCulture;
Run Code Online (Sandbox Code Playgroud)