当前位置:编程学习 > VB >>

怎么让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


标准模块:

'数学计算器函数。
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
--------------------编程问答-------------------- 哈哈,输入表达式:(1314*89+99-456)/1234,计算结果为:94.4805510534846 --------------------编程问答-------------------- 只能:加减乘除四则运算,其他不行!
补充:VB ,  控件
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,