怎么让Text文本框支持任何的计算
例如在文本框中输入(5+(1+2)*3)/4
在lable中得到6
谢谢 --------------------编程问答-------------------- 比较简单的方法是用控件,比如FlexGrid,其单元格可以设置简单的数学公式。
设置时可以让FlexGrid控件的visible=false.
--------------------编程问答-------------------- '(5+(1+2)*3)/4 光用眼睛看也知道你用了全型字符, 在网上一堆代码,一堆人使用的 ' "" () 早就领教了.
'楼主下次请多加注意自己求教的代码或文字.
'添加 Text1 Label1
Private Sub Form_Load()
Text1.Text = "(5+(1+2)*3)/4"
Text1.SelStart = Len(Text1.Text)
SendKeys Chr(13)
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then Label1.Caption = GetResult(Text1.Text)
End Sub
Function GetResult(Tstr$) As String
On Error GoTo Errhandle
Set sc = CreateObject("ScriptControl")
sc.Language = "VBScript"
GetResult = sc.EVal(Text1)
Set sc = Nothing
Errhandle:
If Err > 0 Then MsgBox Err.Description
End Function
--------------------编程问答-------------------- 一是自己实现,二是用别的组件....
自己实现就不说了,好好分析优先级吧....就是一个解析引擎..
用别的组件,楼上是一个办法.
我也来发一个办法:
引用 Microsoft Script Control,使用它的.Eval方法,可以直接计算VB表达式. --------------------编程问答-------------------- ...我说的"楼上"指1楼.... --------------------编程问答-------------------- (5+(1+2)*3)/4=6? --------------------编程问答-------------------- 哈哈哈...先乘除后加减, 有括弧优先运算
(5 + (1 + 2) * 3) / 4
(5+3*3)/4
(5+9)/4
14/4
3.5 --------------------编程问答-------------------- 窗体模块:
Option Explicit
'一个Label1标签,一个命令按钮command1,一个文本框textbox
'比如:在文本框中输入(5+(1+2)*3)/4,结果为3.5
Private Sub Command1_Click()
Label1.Caption = MathCalculator(Text1.Text)
End Sub
Private Sub Form_Load()
Text1.Text = ""
End Sub
标准模块:
'数学计算器函数。--------------------编程问答-------------------- 哈哈,输入表达式:(1314*89+99-456)/1234,计算结果为:94.4805510534846 --------------------编程问答-------------------- 只能:加减乘除四则运算,其他不行!
Public Function MathCalculator(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
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 = MathCalculator(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
MathCalculator = Mid(GS, 1, Len(GS) - 1)
Exit Function
End If
End If
End If
End If
Loop
Err:
MathCalculator = "表达式错误!"
End Function
补充:VB , 控件