VB6-使用特定区域性将字符串转换为双精度吗?

问题描述 投票:3回答:3

我是一位长期的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,是否有任何内置方法,函数,可以使用特定区域性将字符串转换为双精度?或至少暗示转换可能是我们正在处理另一种格式?

我们仍在研究如何写入值,并查看是否可以对流程进行反向工程以提供一致的结果。但是,我们的客户已经拥有一种或另一种格式的数据(或正在检查……或两种),因此,此时适当的转换算法或实现将是一个更好的答案。

vb6 localization type-conversion
3个回答
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

2
投票

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

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

通常,当前区域设置是从控制面板获取的。您可以调用rumours来更改SetThreadLocale,以在运行时从代码中更改区域设置-从未亲自尝试过。


0
投票

Dim Str as String昏暗的mValue两倍str =“ 100,10”

mValue = CDbl(Val(str))

''在Visual Basic中,经过测试的工作非常快速有效。''步骤1:从字符串转换为值表示形式。''步骤2:从值表示形式转换为双整数值。

© www.soinside.com 2019 - 2024. All rights reserved.