VB6 - 使用特定文化将字符串转换为double?

时间:2012-03-21 22:56:52

标签: vb6 localization type-conversion

我是一名C#开发人员,最近不得不查看一些VB6代码。经过一番挖掘,我们发现,在某个地方,某种程度上,我们将数字存储为字符串。现在我们正在阅读它,我们的代码并没有很好地处理文化差异。这是一个例子:

Dim text as String
Dim myVal as Double
Set text = "1,123456"
'This sets the value of myVal to 1123456 on our system - incorrect
myVal = text

Set text = "1.123456"
'This sets the value of myVal to 1.123456 on our system - correct
myVal = text

请记住这是VB6而不是VB.NET,是否有任何内置的方法,函数,等等,可以使用特定的文化将字符串转换为double? 或者至少,暗示我们可能正在处理不同格式的转换?

我们仍在挖掘如何编写价值,看看我们是否可以对流程进行逆向工程,以便为我们提供一致的结果。但是,我们的客户已经拥有(有)一种格式或另一种格式(或两者,我们正在检查......)的数据,因此适当的转换算法或实现将是更好的答案。

3 个答案:

答案 0 :(得分:7)

我过去曾使用过这个快速而又脏的功能来获取文本的双重功能。在阿根廷,人们有时使用点,有时使用逗号来分隔十进制值,因此该函数已准备好接受这两种格式。如果只有一个标点符号,则表示它是小数点分隔符。

function ConvertDBL( texto )
    dim retval, SepDecimal, SepMiles
    If texto = "" then texto = "0"
    retval = replace(trim(texto), " ", "")
    If cdbl("3,24") = 324 then
        SepDecimal = "."
        SepMiles = ","
    else
        SepDecimal = ","
        SepMiles = "."
    end if  
    If InStr( Retval, SepDecimal ) > 0 then
        If InStr( Retval, SepMiles ) > 0 then
            If InStr( Retval, SepDecimal ) > InStr( Retval, SepMiles ) then
                Retval = replace( Retval, SepMiles, "" )
            else
                Retval = replace( Retval, SepDecimal, "" )
                Retval = replace( Retval, SepMiles, SepDecimal )
            end if
        end if      
    else
        Retval = replace( Retval, SepMiles, SepDecimal )
    end if
    ConvertDbl = cdbl( retval ) 
end function

答案 1 :(得分:2)

您无法通过传递.Net中的文化对象来选择任意文化。您可以选择:

  • 始终使用当前区域设置的功能。 CStrFormatCDbl等。隐式转化(如您问题中的转换)也使用当前的区域设置。
  • 始终使用美国区域设置的功能(类似于.Net不变文化)。 StrVal

通常,当前的区域设置来自控制面板。有rumours可以调用SetThreadLocale在运行时从代码更改区域设置 - 从不自己尝试过。

答案 2 :(得分:0)

在Visual Basic中,经过测试的工作非常快速有效。

第1步:从字符串转换为值表示形式。

步骤2:从值表示形式转换为双精度整数值。

Dim Str as String
Dim mValue as double
str = "100,10"

mValue = CDbl(Val(str))

相关问题