如何使用application.currentCulture同步microsoft.visualbasic.compatibility.vb6.format的文化?

时间:2012-10-20 09:35:59

标签: vb.net compatibility

上下文:用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(正如您所料),但显然(我不知道这一点,但意外地发现)听取了在区域设置,并立即响应您在程序执行期间所做的任何更改。这意味着CDbl()和VB6.Format()变得相互矛盾。

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

然而,VB6.FORMAT与“普通”的“不同行为”被视为关于文化/区域设置变化的CDbl(someString),这让我觉得不可取。最好让VB6.Format始终遵守应用程序/线程 - CurrentCulture,然后您可以选择希望代码如何响应用户首选项更改。此外,我想在这个问题上获得更多的见解。

因此,我的问题是: 有没有办法编译/安排/ ...这样的事情(Microsoft.VisualBasic.Compatibility。)VB6.Format监听应用程序-CurrentCulture而不回复 - 没有“我们的同意” - 区域设置的变化?< / p>

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

欢迎任何“教育”信息或建议。这个问题并没有在我们的程序中引起任何实际问题,但我觉得我们应该/可能有更好的理解,甚至可能使方法更加健壮。

1 个答案:

答案 0 :(得分:1)

VB6 Format()函数实际上是一个操作系统功能。 VarFormat(),由oleaut32.dll导出的函数。 Backgrounder回答is here。 MSDN库文章is here

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