C#中如何获取控制面板的货币格式

How to obtain the control panel currency format in C#

当文化设置使用“$”作为货币符号时,我们的报告生成器工作正常。

现在我们想在欧洲使用它并改用“€”。

我转到控制面板,将 "Region and Language" 格式更改为 "Danish (Denmark)" 并应用更改。

现在打开 Excel 并输入一个数字,然后将单元格格式设置为货币,货币符号已更新。

但是,我们的报告生成器仍在使用“$”。在调试软件时我们发现CultureInfo.CurrentCulture仍然是使用“$”的文化(即en-AU)。

(代码很简单,我只是简单地写在这里:)

result = ValueToDisplay.ToString("C"); //CultureInfo.CurrentCulture is "en-AU"

我认为当用户的计算机在欧洲时这可能不是真正的问题,因为在那种情况下 CultureInfo.CurrentCulture 会有所不同。

但是,显然Excel可以在不重启计算机的情况下对应控制面板中的设置更改,所以理论上我们的软件应该也可以这样做。

那么我们如何像 Excel 那样工作呢?

感谢提示,我发现我们的程序确实重置了文化并将原始文化存储在其他地方。当把代码改成

result = ValueToDisplay.ToString("C", originalCulture);

这很好用。

您可以在不重新启动应用程序的情况下通过侦听指示语言环境已更改的事件然后清除 CultureInfo 缓存来处理此问题。

要监听该事件,您可以这样做:

SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged;

然后在事件处理程序中,您可以清除文化缓存:

private void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
{
    if (e.Category == UserPreferenceCategory.Locale)
        CultureInfo.CurrentCulture.ClearCachedData();
}

现在,当您 运行 像这样编码时:

var number = 21.00;
MessageBox.Show(number.ToString("C"));

您将根据用户更改的任何区域设置信息获得正确的输出。