当区域性设置使用"$"作为货币符号时,我们的报表生成器工作正常。
现在我们想在欧洲使用这个,用" - "代替。
我去控制面板,将"区域和语言"格式更改为"丹麦(丹麦)",并应用更改。
现在打开Excel并输入一个数字,然后将单元格格式设置为货币,货币符号被更新。
但是,我们的报表生成器仍然使用"$"。当调试软件时,我们发现CultureInfo.CurrentCulture
仍然是使用"$"的文化(即en-AU
)。
(代码是微不足道的,但我只是简单地写在这里:)
result = ValueToDisplay.ToString("C"); //CultureInfo.CurrentCulture is "en-AU"
我认为这可能不是一个真正的问题,当用户的计算机是在欧洲,因为在这种情况下CultureInfo.CurrentCulture
将是不同的。
然而,很明显,Excel可以在控制面板中对应设置更改,甚至不需要重新启动计算机,所以理论上我们的软件也应该能够做到这一点。
那么我们如何像Excel一样工作呢?
您可以通过侦听指示区域设置已更改的事件并清除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"));
您将根据用户更改的语言环境信息获得正确的输出。
多亏了这些提示,我发现我们的程序确实重置了区域性并将原始区域性存储在其他地方。将代码更改为
时result = ValueToDisplay.ToString("C", originalCulture);