楼主是不是这个意思??函数明用了中文的,懒得改了vb计算字符串算式函数:Public Function 计算(GS As String) As String Dim i, n As Integer Dim TempGs, Temp As String Dim Vl() As String '操作数 Dim Vls As Integer '操作数的数目 Dim Si As Integer '上一操作符的位置 Dim Ads, Sus, Mus, Bys, Lks, Rks As Integer '操作符的数目 Dim Adp(), Mup(), Byp(), Lkp(), Rkp() As Integer '操作符的位置 Dim Adn(), Mun(), Byn() As Integer '操作符的排列次序 Dim Sig() As Integer '每一个操作符的位置
On Error GoTo Err Do While True ReDim Adp(Len(GS)), Mup(Len(GS)), Byp(Len(GS)) _ , Lkp(Len(GS)), Rkp(Len(GS)) As Integer ReDim Adn(Len(GS)), Mun(Len(GS)), Byn(Len(GS)) _ , Lkn(Len(GS)), Rkn(Len(GS)), Sig(Len(GS)) As Integer
ReDim Vl(Len(GS))
If Len(GS) = 0 Then GoTo Err If Mid(GS, Len(GS), 1) <> "#" Then
TempGs = GS For i = 1 To Len(GS) '将减化加
If Mid(GS, i, 1) = "-" And i <> 1 Then If Mid(GS, i - 1, 1) <> "+" And Mid(GS, i - 1, 1) <> "-" _ And Mid(GS, i - 1, 1) <> "*" And Mid(GS, i - 1, 1) <> "/" Then TempGs = Mid(TempGs, 1, i - 1 + n) + "+" + Mid(GS, i) n = n + 1 End If
End If Next i GS = TempGs
n = 0 For i = 1 To Len(GS) '处理负负得正 If Mid(GS, i, 1) = "-" Then If Mid(GS, i + 1, 1) = "-" Then TempGs = Mid(TempGs, 1, i - 1 - n) + Mid(GS, i + 2) n = n + 2 End If End If Next i GS = TempGs GS = GS + "#" End If
Select Case Mid(GS, i, 1) Case "+" Ads = Ads + 1 Adp(Ads) = i Adn(Ads) = Vls Case "*" Mus = Mus + 1 Mup(Mus) = i Mun(Mus) = Vls Case "/" Bys = Bys + 1 Byp(Bys) = i Byn(Bys) = Vls Case "(" Lks = Lks + 1 Lkp(Lks) = i
Case ")" Rks = Rks + 1 Rkp(Rks) = i
End Select
If Mid(GS, i, 1) = "+" Or Mid(GS, i, 1) = "*" Or _ Mid(GS, i, 1) = "/" Or Mid(GS, i, 1) = "#" Then
If Si + 1 = i And Mid(GS, i + 1, 1) <> "#" _ Then '操作符非法连续或以操作符开头 GoTo Err Else Si = i End If
If Not IsNumeric(Vl(Vls)) And Mid(GS, i + 1, 1) <> "#" _ Then '操作数不是数字 GoTo Err End If Sig(Vls) = i Vls = Vls + 1
Else If Mid(GS, i, 1) <> "(" And Mid(GS, i, 1) <> ")" Then Vl(Vls) = Vl(Vls) + Mid(GS, i, 1) '制作操作数 Else If i <> 1 Then If ((Mid(GS, i - 1, 1) = "(" And Mid(GS, i, 1) = ")") Or _ (Mid(GS, i - 1, 1) = ")" And Mid(GS, i, 1) = "(")) _ Then '判定括号前后符号的合法性 GoTo Err End If End If End If End If
Next i
If Lks <> Rks Then GoTo Err '左右括号数是否匹配 End If
For i = 1 To Lks If Lkp(i) > Rkp(i) Then GoTo Err '左右括号出现顺序错误 Next i
If Lks <> 0 Then '括号处理 Do While True For i = Lks To 1 Step -1 For n = Rks To 1 Step -1 Temp = 计算(Mid(GS, Lkp(i) + 1, Rkp(n) - Lkp(i) - 1)) If Temp <> "公式有错误" Then GS = Mid(GS, 1, Lkp(i) - 1) + Temp + Mid(GS, Rkp(n) + 1) Exit Do End If Next n Next i If Temp = "公式有错误" Then GoTo Err '括号中有错误退出 Loop Else If Mus <> 0 Then '乘法处理 GS = Mid(GS, 1, Sig(Mun(1) - 1)) + Trim(Str(Val(Vl(Mun(1))) _ * Val(Vl(Mun(1) + 1)))) + Mid(GS, Val(Mup(1)) + Len(Vl(Mun(1) _ + 1)) + 1) Else If Bys <> 0 Then '除法处理 GS = Mid(GS, 1, Sig(Byn(1) - 1)) + Trim(Str(Val(Vl(Byn(1))) _ / Val(Vl(Byn(1) + 1)))) + Mid(GS, Val(Byp(1)) + Len(Vl(Byn(1) _ + 1)) + 1) Else If Ads <> 0 Then '加法处理 GS = Trim(Str(Val(Vl(1)) + Val(Vl(2)))) + Mid(GS, Val(Adp(1)) _ + Len(Vl(2)) + 1) Else 计算 = Mid(GS, 1, Len(GS) - 1) Exit Function End If End If End If End If Loop
Err: 计算 = "公式有错误"
End Function
Option Explicit Private Sub Command1_Click() Dim i i = Format(1 / 2, "0.0") Debug.Print i End Sub
问题是如何将text的文本保留为double型 Dim i As Double i = Format(Text1.Text, "0.0") 'i的值为37988 如何解释啊
VB是编译型软件,没有这种函数,但VBSCRIPT有EVAL函数可以直接使用。
Private Declare Function EbExecuteLine Lib "vba6.dll" (ByVal pStringToExec As Long, ByVal Unknownn1 As Long, ByVal Unknownn2 As Long, ByVal fCheckOnly As Long) As Long Dim sPrivate Sub Command1_Click() Dim res As Long Text1.Text = "1/2" res = EbExecuteLine(StrPtr(Me.Name & ".s=" & Me.Text1.Text), 0&, 0&, 0) MsgBox Format(s, "0.0") End Sub
Private Sub Command1_Click()
Dim i
i = Format(1 / 2, "0.0")
Debug.Print i
End Sub
可以自己写函数,也可以用script control
回复人: nik_Amis(Azrael) ( ) 信誉:114 2004-01-05 15:48:00 得分:0
你们在那里乱写,hehe val是那么用的么?晕死了val("1/2")
Dim i, n As Integer
Dim TempGs, Temp As String
Dim Vl() As String '操作数
Dim Vls As Integer '操作数的数目
Dim Si As Integer '上一操作符的位置
Dim Ads, Sus, Mus, Bys, Lks, Rks As Integer '操作符的数目
Dim Adp(), Mup(), Byp(), Lkp(), Rkp() As Integer '操作符的位置
Dim Adn(), Mun(), Byn() As Integer '操作符的排列次序
Dim Sig() As Integer '每一个操作符的位置
On Error GoTo Err
Do While True
ReDim Adp(Len(GS)), Mup(Len(GS)), Byp(Len(GS)) _
, Lkp(Len(GS)), Rkp(Len(GS)) As Integer
ReDim Adn(Len(GS)), Mun(Len(GS)), Byn(Len(GS)) _
, Lkn(Len(GS)), Rkn(Len(GS)), Sig(Len(GS)) As Integer
ReDim Vl(Len(GS))
If Len(GS) = 0 Then GoTo Err
If Mid(GS, Len(GS), 1) <> "#" Then
TempGs = GS
For i = 1 To Len(GS) '将减化加
If Mid(GS, i, 1) = "-" And i <> 1 Then
If Mid(GS, i - 1, 1) <> "+" And Mid(GS, i - 1, 1) <> "-" _
And Mid(GS, i - 1, 1) <> "*" And Mid(GS, i - 1, 1) <> "/" Then
TempGs = Mid(TempGs, 1, i - 1 + n) + "+" + Mid(GS, i)
n = n + 1
End If
End If
Next i
GS = TempGs
n = 0
For i = 1 To Len(GS) '处理负负得正
If Mid(GS, i, 1) = "-" Then
If Mid(GS, i + 1, 1) = "-" Then
TempGs = Mid(TempGs, 1, i - 1 - n) + Mid(GS, i + 2)
n = n + 2
End If
End If
Next i
GS = TempGs
GS = GS + "#"
End If
Vls = 1
Ads = 0: Sus = 0: Mus = 0: Bys = 0: Lks = 0: Rks = 0
For i = 1 To Len(GS)
Select Case Mid(GS, i, 1)
Case "+"
Ads = Ads + 1
Adp(Ads) = i
Adn(Ads) = Vls
Case "*"
Mus = Mus + 1
Mup(Mus) = i
Mun(Mus) = Vls
Case "/"
Bys = Bys + 1
Byp(Bys) = i
Byn(Bys) = Vls
Case "("
Lks = Lks + 1
Lkp(Lks) = i
Case ")"
Rks = Rks + 1
Rkp(Rks) = i
End Select
If Mid(GS, i, 1) = "+" Or Mid(GS, i, 1) = "*" Or _
Mid(GS, i, 1) = "/" Or Mid(GS, i, 1) = "#" Then
If Si + 1 = i And Mid(GS, i + 1, 1) <> "#" _
Then '操作符非法连续或以操作符开头
GoTo Err
Else
Si = i
End If
If Not IsNumeric(Vl(Vls)) And Mid(GS, i + 1, 1) <> "#" _
Then '操作数不是数字
GoTo Err
End If
Sig(Vls) = i
Vls = Vls + 1
Else
If Mid(GS, i, 1) <> "(" And Mid(GS, i, 1) <> ")" Then
Vl(Vls) = Vl(Vls) + Mid(GS, i, 1) '制作操作数
Else
If i <> 1 Then
If ((Mid(GS, i - 1, 1) = "(" And Mid(GS, i, 1) = ")") Or _
(Mid(GS, i - 1, 1) = ")" And Mid(GS, i, 1) = "(")) _
Then '判定括号前后符号的合法性
GoTo Err
End If
End If
End If
End If
Next i
If Lks <> Rks Then
GoTo Err '左右括号数是否匹配
End If
For i = 1 To Lks
If Lkp(i) > Rkp(i) Then GoTo Err '左右括号出现顺序错误
Next i
If Lks <> 0 Then '括号处理
Do While True
For i = Lks To 1 Step -1
For n = Rks To 1 Step -1
Temp = 计算(Mid(GS, Lkp(i) + 1, Rkp(n) - Lkp(i) - 1))
If Temp <> "公式有错误" Then
GS = Mid(GS, 1, Lkp(i) - 1) + Temp + Mid(GS, Rkp(n) + 1)
Exit Do
End If
Next n
Next i
If Temp = "公式有错误" Then GoTo Err
'括号中有错误退出
Loop
Else
If Mus <> 0 Then '乘法处理
GS = Mid(GS, 1, Sig(Mun(1) - 1)) + Trim(Str(Val(Vl(Mun(1))) _
* Val(Vl(Mun(1) + 1)))) + Mid(GS, Val(Mup(1)) + Len(Vl(Mun(1) _
+ 1)) + 1)
Else
If Bys <> 0 Then '除法处理
GS = Mid(GS, 1, Sig(Byn(1) - 1)) + Trim(Str(Val(Vl(Byn(1))) _
/ Val(Vl(Byn(1) + 1)))) + Mid(GS, Val(Byp(1)) + Len(Vl(Byn(1) _
+ 1)) + 1)
Else
If Ads <> 0 Then '加法处理
GS = Trim(Str(Val(Vl(1)) + Val(Vl(2)))) + Mid(GS, Val(Adp(1)) _
+ Len(Vl(2)) + 1)
Else
计算 = Mid(GS, 1, Len(GS) - 1)
Exit Function
End If
End If
End If
End If
Loop
Err:
计算 = "公式有错误"
End Function
Private Sub Command1_Click()
Dim i
i = Format(1 / 2, "0.0")
Debug.Print i
End Sub
Dim i As Double
i = Format(Text1.Text, "0.0")
'i的值为37988
如何解释啊
Dim sPrivate Sub Command1_Click()
Dim res As Long
Text1.Text = "1/2"
res = EbExecuteLine(StrPtr(Me.Name & ".s=" & Me.Text1.Text), 0&, 0&, 0)
MsgBox Format(s, "0.0")
End Sub