-1

我正在处理一些可能形式的输入

$1,200
20 cents/ inch
$10

有没有办法将这些解析为VB中的数字?还打印这些数字?

编辑:正则表达式会很棒。

编辑:特别是 VB 6

4

3 回答 3

3

你是说 VB6/VBA 还是 VB.net?在 VB6 或 VBA 中,您可以执行CLng()CDec()取决于您想要的数字类型。他们会很好地处理开头的美元符号和逗号。为了处理 20 美分/英寸,您可能应该做类似的事情

CLng(split("20 cents / inch", " ")(0))

如果无法转换,这些函数会引发类型转换错误。如果它们失败,您可以捕获它并尝试以另一种方式转换它。

还有一个名为 Val 的函数,它返回数字部分。它不会生成类型转换错误,例如CDec. 但它也不处理任何非数字输入。只要字符串以数字开头,它就会为您提供字符串中数字的十进制值。它忽略任何尾随字符。

于 2008-10-23T19:24:18.703 回答
1

嗯......假设你想要的只是数字,我会使用正则表达式来简单地用“”替换任何非数字。

您需要在项目中引用 Microsoft VBScript 正则表达式。然后假设您的文本位于名为 strTest 的变量中。这是一些未经测试的即兴代码:

Dim oRE As Object
Set oRE = New VBScript_RegExp.RegExp
oRe.Pattern = "\D"
strTest = oRE.Replace(strTest, "")
于 2008-10-23T19:07:07.477 回答
1

有时它只需要蛮力!

这是一个例程,它接收一个带有数字的字符串,并返回一个用分数、M 或 B 后缀等正确处理的数字。您可以修改 i 以处理任何特殊条件或文本代数(英里/小时、美分/英寸等)

这是从我们的一个生产应用程序中获取的,因此是我们在错误处理程序 (ERHandler) 中使用的行号,以及标准退出例程。

Function GetNumberFromString(s As String) As Currency
12800 Const ProcID = "GetNumberFromString"
12810 Dim c                                   As String
12820 Dim d                                   As Integer
12830 Dim Denominator                         As Double ' currency only handles 4 places
12840 Dim HaveDec                             As Boolean
12850 Dim HaveSlash                           As Boolean
12860 Dim HaveSpace                           As Boolean
12870 Dim i                                   As Integer
12880 Dim LenV                                As Integer
12890 Dim NegMult                             As Integer
12900 Dim Numerator                           As Currency
12910 Dim TempVal                             As Currency
12920 Dim v                                   As String

      'Provides the functionality of VAL, but handles commas, fractions
      ' also million and billion

12930 On Error GoTo ErrLbl
12940 oLog.LogProcEntry ModuleID, ProcID, "v=" & v

12950 v = Trim(s)
12960 LenV = Len(v)
12970 If LenV = 0 Then
12980     GetNumberFromString = 0
12990     GoTo ExitProc
13000 End If
13010 TempVal = 0
13020 d = 0
13030 NegMult = 1
      '
13040 For i = 1 To LenV
13050     c = Mid(v, i, 1)
13060     Select Case c
          Case "0" To "9"
13070         If HaveSpace Then
13080             If Not HaveSlash Then
13090                 Numerator = 10 * Numerator + Asc(c) - 48
13100             Else
13110                 Denominator = 10 * Denominator + Asc(c) - 48
13120             End If
13130         ElseIf Not HaveDec Then
13140             TempVal = 10 * TempVal + Asc(c) - 48
13150         Else
13160             TempVal = TempVal + ((Asc(c) - 48)) / (10 ^ d)
13170             d = d + 1
13180         End If
13190     Case ",", "$"
          ' do nothing
13200     Case "-" 'let handle negatives ns 12/20/96
13210         NegMult = -1 * NegMult
13220     Case "(" 'let handle negatives mt 6/9/99
13230         NegMult = -1 * NegMult
13240     Case "."
13250         HaveDec = True
13260         d = 1
13270     Case " "
13280         HaveSpace = True
13290         d = 1
13300     Case "/"
13310         HaveSlash = True
13320         If Not HaveSpace Then
13330             HaveSpace = True
13340             Numerator = TempVal
13350             TempVal = 0
13360         End If
13370     Case "b", "B"
13380         If UCase(Mid(v, i, 7)) = "BILLION" Then
13390             TempVal = TempVal * 1000000000#
13400             Exit For
13410         End If
13420     Case "m", "M"
13430         If UCase(Mid(v, i, 7)) = "MILLION" Then
13440             TempVal = TempVal * 1000000#
13450             Exit For
13460         End If
13470     Case Else
          ' ignore character/error
13480     End Select
13490 Next i

13500 If HaveSlash And Denominator <> 0 Then
13510     TempVal = TempVal + Numerator / Denominator
13520 End If

13530 GetNumberFromString = TempVal * NegMult

ExitProc:
13540 oLog.LogProcExit ModuleID, ProcID
13550 Exit Function

ErrLbl:
13560 Debug.Print Err.Description, Err.Number
13570 Debug.Assert False
13580 ERHandler ModuleID, ProcID
13590 Resume
End Function
于 2008-10-23T22:01:34.067 回答