确保字符串数字操作与文化无关

Making sure string numbers operations are culture independent

我通过 XmlHttp 请求下载汇率,该请求作为 string(作为 <div> 元素的 .innerText)进入代码并表示double 键入数字:1.525.

构建此脚本时,我是在具有英语文化模型的 OS 上完成的(即 1.525 表示 1 个单位和 0.525 位小数)。 但是,此脚本现在将 运行 用于法语 OS,它使用逗号 , 而不是 . 来分隔小数点。

这意味着,如果 . 而不是 ,,操作 Application.Evaluate(10000/myRate) 将失败。

简单的解决方案是替换“.”。通过 Application.Evaluate(10000/Replace(myRate,".",",") 加上“,”。然而,这显然不太好,因为现在脚本在英语系统上会失败。

有了 VB.NET,我可以通过像这样转换它来使其独立于文化:

myRate.ToDouble(System.Globalization.CultureInfo.InvariantCulture)

我已经尝试谷歌搜索 VBA 替代方案一段时间但没有成功;有谁知道是否有比替换“.”更优雅的方式来国际化我的脚本?用“,”?

这是我目前的解决方案(我不太喜欢):

On Error Resume Next
test = CDbl(myRate)/2
If Err.Number <> 0 Then
    myRate = Replace(myRate,".",",")
    On Error GoTo 0
End If 

使用 Application.DecimalSeparator 属性?

Application.Evaluate(10000/CDbl(Replace(myRate,".", Application.DecimalSeparator))

您可以使用 Application 对象临时更改小数点和千位分隔符。

读取几个当前 OS(国际)设置:Application.International(index) property

要更改:

Application.ThousandsSeparator = "." 

在 MS Access 中,我们没有 Application.DecimalSeparatorApplication.ThousandsSeparatorApplication.International。我们只有 Val(vString)Str(vNumber)。他们都使用英语(不变)文化转换参数。

因此,在 MS Access 中,OP 的问题可以这样解决:

vResult = 10000/Val(myRate)