1

上下文:用VB.NET编写的程序,在VisualStudio2012中开发/维护,针对框架v3.5。

几年前,该程序在 VB(6) 中,我们将其“翻译”为 VB.NET。由于大部分是自动化的转换,我们在代码中仍有相当多的地方处理文本表示的双精度(和日期/...)格式,如下所示:

Dim sValue As String = Microsoft.VisualBasic.Compatibility.VB6.Format(dblValue, "0.00")

相反,当我们需要从这样的字符串中提取 Double 值时,我们使用

Dim dblValue As Double = CDbl(sValue)

CDbl“监听”应用程序线程的 System.Globalization.CultureInfo.CurrentCulture,当您在代码运行期间通过控制面板更改区域设置时,这不会改变。

但是,在代码中执行的 VB6.Format 开始符合应用程序的 currentCulture(如您所料),但显然(我不知道这一点,但偶然发现)在区域设置中收听 CHANGES 和立即响应您在程序执行期间所做的任何更改。这意味着 CDbl() 和 VB6.Format() 变得相互不一致。

当然,在程序执行期间更改区域设置很麻烦,而且,如果您希望支持它,您可以通过捕获 SystemEvents.UserPreferenceChanged(和 -Changing)事件来管理它并根据它们的发生采取行动。

然而,关于文化/区域设置的变化,VB6.FORMAT 与“正常”转换为 CDbl(someString) 的“不同行为”让我觉得不受欢迎。最好让 VB6.Format 始终遵守应用程序/线程 CurrentCulture,然后您可以选择您希望代码如何响应用户偏好更改。此外,我想对这个问题有更多的了解。

因此,我的问题是:有没有办法编译/安排/...诸如 (Microsoft.VisualBasic.Compatibility.)VB6.Format 监听应用程序-CurrentCulture 并且不响应 - 未经“我们的同意” -更改区域设置?

附加信息:该程序是用 - 对于 visualbasic 的东西 - 项目 (VisualStudio2012) 中的一个引用来编译的:C:\Windows\Microsoft.Net\Framework\V2.0.50727\Microsoft.VisualBasic.Compatibility.dll (和.. .Data.dll)。

欢迎任何“教育”信息或建议。这个问题并没有在我们的程序中造成任何真正的问题,但我觉得我们应该/可能有更好的理解,甚至可能有方法让事情变得更健壮。

4

1 回答 1

1

VB6 Format() 函数实际上是一个操作系统函数。VarFormat(),oleaut32.dll 导出的函数。背景回答在这里。MSDN 库文章在此处

从 MSDN 文章中可以看出,该功能不允许指定文化或文化特定设置,除了星期几规则。这个功能可以追溯到 1996 年,那时的生活要简单得多。所以你现在看到的很容易解释,它对 .NET Thread.CurrentCulture 设置一无所知。

于 2012-10-20T11:23:28.703 回答