VB中如何将字符串转换成数值来运算?
'使⽤下⾯提供给你的函数可以做到这点!
'先定义2个结构Parent和Plus,把这2个定义放在代码段最前⾯
Private Type Parent
s As String
value As Double
End Type
Private Type Plus
s As String
value As Double
End Type
'下⾯是实现此功能的函数的定义,⽐较长
Public Function ValueOfExpression(ByVal Express As String) As Double
Dim Pa() As Parent, ParNum As Integer, Ps() As Plus, OperNum As Integer
Dim str0 As String
'按括号分解表达式 Express:Begin-----/*
Dim lenExp As Integer, Lenstr1 As Integer, i As Integer, j As Integer, k As Integer, str1 As String, str2 As String, intPar As Integer Dim intStart As Integer, intEnd As Integer
lenExp = Len(Express)
vb 字符串转数组For i = 1 To lenExp
If Mid(Express, i, 1) = "(" Then intPar = intPar + 1
Next
ParNum = intPar
ReDim Pa((intPar / 10 + 1) * 10)
For i = 1 To intPar
If intPar < 1 Then Exit For
For j = 1 To lenExp
If Mid(Express, j, 1) = ")" Then
str1 = Mid(Express, 1, j - 1)
Exit For
End If
Next
Lenstr1 = Len(str1)
For k = 1 To Lenstr1
If Mid(str1, Lenstr1 + 1 - k, 1) = "(" Then
Pa(i).s = Mid(str1, Lenstr1 + 2 - k)
Exit For
End If
Next
Express = Mid(Express, 1, Lenstr1 - k) & Chr(128) & CStr(i) & Mid(Express, j + 1)
lenExp = Len(Express)
Next
Pa(0).s = Express
'*/-----End
'按加减号进⼀步分解:Begin-----/*
Dim n As Integer, strLeft As String
For i = 0 To ParNum
k = 0
For j = 1 To Len(Pa(i).s)
str1 = Mid(Pa(i).s, j, 1)
If str1 = "+" Or str1 = "-" Then k = k + 1
Next
If k > OperNum Then OperNum = k
Next
ReDim Ps(ParNum, OperNum)
For i = 0 To ParNum
strLeft = Pa(i).s: n = 0: str2 = ""
Do
If Len(strLeft) = 0 Then Exit Do
For j = 1 To Len(strLeft)
str1 = Mid(strLeft, j, 1)
If str1 = "+" Or str1 = "-" Then
Ps(i, n).s = str2 & Mid(strLeft, 1, j - 1)
str2 = IIf(str1 = "-", str1, "")
strLeft = Mid(strLeft, j + 1)
Exit For
End If
If j = Len(strLeft) Then
Ps(i, n).s = str2 & strLeft: j = 0
Exit For
End If
Next
Loop Until j = 0
Next
'*/-----End
'计算最后分成的多个简单表达式的值的总和,即表达式 Express 的值
Dim Total As Double, value As Double
For i = 1 To ParNum + 1
If i = ParNum + 1 Then i = 0
Total = 0
For j = 0 To OperNum
Express = Ps(i, j).s: value = 0
Dim lasti As Integer, operator As String
lenExp = Len(Express): lasti = 0: operator = ""
For k = 1 To lenExp
str0 = Mid(Express, k, 1)
If InStr("*/^", str0) > 0 Or k = lenExp Then
If k = lenExp Then k = k + 1
str1 = Mid(Express, lasti + 1, k - 1 - lasti)
Dim sign As Integer, Valstr1 As Double
If Mid(str1, 1, 1) = "-" Then
sign = -1
str1 = Mid(str1, 2)
Else
sign = 1
End If
n = InStr(1, "/sin" & Chr(128) & "/cos" & Chr(128) & "/tan" & Chr(128) & "/abs" & Chr(128) & "/atn" & Chr(128) & "/exp" & Chr(128) & "/int" & Chr(128) & "/fix" & Chr(128) & "/sgn" & Chr(128) & "/sqr" & Chr(128) & "/", "/" & Mid(str1, 1, 4) & "/")
If n > 0 Then
Valstr1 = Choose((n + 4) / 5, Sin(Pa(Val(Mid(str1, 5))).value), Cos(Pa(Val(Mid(str1, 5))).value), Tan(Pa(
Val(Mid(str1, 5))).value), Abs(Pa(Val(Mid(str1, 5))).value), Atn(Pa(Val(Mid(str1, 5))).value), Exp(Pa(Val(Mid(str1, 5))).value), Int(Pa(Val(Mid(str1, 5))).value),
Fix(Pa(Val(Mid(str1, 5))).value), Sgn(Pa(Val(Mid(str1, 5))).value), Sqr(Pa(Val(Mid(str1, 5))).value))
Else
n = InStr(1, "/lg" & Chr(128) & "/ln" & Chr(128) & "/", Mid(str1, 1, 3))
If n > 0 Then
Valstr1 = Choose((n + 3) / 4, Log(Pa(Val(Mid(str1, 4))).value) / Log(10), Log(Pa(Val(Mid(str1, 4))).value))
Else
If Mid(str1, 1, 1) = Chr(128) Then
Valstr1 = Pa(Val(Mid(str1, 2))).value
ElseIf Right(str1, 1) = "!" Then
If Val(str1) = 0 Then
Valstr1 = 1
Else
Valstr1 = 1
For n = 1 To Val(str1)
Valstr1 = Valstr1 * n
Next
End If
Else
Valstr1 = Val(str1)
End If
End If
End If
Valstr1 = Valstr1 * sign
Select Case operator
Case ""
value = Valstr1
Case "*"
value = value * Valstr1
value = value / Valstr1
Case "^"
value = value ^ Valstr1
End Select
lasti = k: operator = str0
End If
Next
Ps(i, j).value = value
Total = Total + Ps(i, j).value
Next
Pa(i).value = Total
If i = 0 Then Exit For
Next
ValueOfExpression = Pa(0).value
End Function
'OK,到这⾥结束了该函数的定义
'使⽤例⼦:
'A="5+5+5"
'Print ValueOfExpression(A)
'其它说明:该函数⽀持很多数学函数如sin、cos、tan等等,如:
'Print ValueOfExpression("sin(1)")
'注意后⾯要加括号
'该函数⽀持运算符+-*/^!,还有括号,^为乘幂,其优先级与*/相同,这是使⽤该函数需要注意的地⽅;!为阶乘'⾃⼰试试就知道怎么回事了!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论