在文本框中写入一个表达式,在另一个文本框中怎样读出它的值?例如?
Private Sub Form_Load()text1.text="1+2+3"text2.text=text1.text'说明怎样把text1.text的内容转为数值表达式。'说明text2.text的最后值为 6End Sub
Private Sub Form_Load()text1.text="1+2+3"text2.text=text1.text'说明怎样把text1.text的内容转为数值表达式。'说明text2.text的最后值为 6End Sub
如果加减乘除都有的话,那复杂多了
'Dim mrsGrid As ADODB.Recordset'------------------------------------------------------------------
'******************计算字符串形式表达式开始************************
'------------------------------------------------------------------
'Function CalculateFieldValueWithFormula(ByVal Exp As String)
' '表达式格式:
' '引用字段值的,字段名要放在方括号[]内
' '可以使用+ - * / 运算符
' '中间可以含空格
' '可以使用圆括号,运算规则:括号优先,之后 :*/优先 ,最后 +-,同级别先算左侧
' Dim L As Integer, R As Integer, FN As String, Fv
'
' '-----------------------------------------------------------------
' '首先将字段名换成数值
' '如果你的应用中不使用纪录集字段值,可以去掉这部分,并
' '从模块声明部分去掉纪录集变量的定义
' Do
' Call GetMatchExp(Exp, "[", "]", L, R)
' If L * L = 0 Then Exit Do
' FN = Mid(Exp, L + 1, R - L - 1)
' If IsNull(mrsGrid.Fields(FN)) Then
' Fv = 0
' Else
' Fv = mrsGrid.Fields(FN).Value
' End If
' Exp = Replace(Exp, "[" & FN & "]", CStr(Fv))
' Loop
' '经过上述处理,已经将所有的字段名替换成字段值,并且表达式中
' '-----------------------------------------------------------------
'
' '-----------------------------------------------------------------
' '将空格删除
' Exp = Replace(Exp, " ", "")
' '-----------------------------------------------------------------
'
' '-----------------------------------------------------------------
' ' 已经没有空格,可以计算仅含运算符、园括弧、数值的表达式
' CalculateFieldValueWithFormula = CalCulNext(Exp)
' '-----------------------------------------------------------------
'End Function
Private Sub GetMatchExp(ByVal Exp As String, LF As String, RF As String, Lp As Integer, Rp As Integer)
'从表达式中,查找匹配起始位置
Dim strT As String
Rp = InStr(Exp, RF)
If Rp = 0 Then
Lp = 0
Else
strT = Left(Exp, Rp - 1)
strT = StrReverse(strT)
Lp = Rp - InStr(strT, LF)
End If
End SubFunction CalCulNext(ByVal Exp As String) As String
'本函数可以计算一个完整的表达式
'计算表达式中最优先的一步
Dim Lp As Integer, Rp As Integer, Mp As Integer, FirstNum As String, SecondNum As String
Call GetMatchExp(Exp, "(", ")", Lp, Rp)
If Lp * Rp = 0 Then '没有括弧
Mp = FirstOperater(Exp) '可用的操作符位置
If Mp = 0 Then '没有运算符
CalCulNext = Exp
Else
FirstNum = GetOpNum(Exp, Mp, True)
SecondNum = GetOpNum(Exp, Mp, False)
CalCulNext = CalCulNext(Mid(Exp, 1, Mp - Len(FirstNum) - 1) _
& CStr(DirectCalValue(FirstNum, SecondNum, Mid(Exp, Mp, 1))) _
& Right(Exp, Len(Exp) - (Mp + Len(SecondNum))))
End If
Else '有括弧
FirstNum = Left(Exp, Lp - 1)
SecondNum = Right(Exp, Len(Exp) - Rp)
CalCulNext = CalCulNext(FirstNum & CalCulNext(Mid(Exp, Lp + 1, Rp - Lp - 1)) & SecondNum)
End If
End Function
Private Function GetOpNum(ByVal Exp As String, ByVal OperPosition As Integer, _
ByVal AtLeft As Boolean) As String
'从表达式中取出指定操作符左或右侧的操作数
Dim I As Integer, pStep As Integer, J As Integer, Ch As String
J = OperPosition
If AtLeft Then
I = 1
pStep = -1
Else
I = Len(Exp)
pStep = 1
J = J + 1
End If
For J = J + pStep To I Step pStep
Ch = Mid(Exp, J, 1)
If Not (Ch >= "0" And Ch <= "9" Or Ch = ".") Then '
I = J - pStep
Exit For
End If
Next J
If AtLeft Then
J = OperPosition
If I > 1 Then
If Mid(Exp, I - 1, 1) = "-" Then
If I = 2 Then '不是第一个字符,检查数字前有无负号
I = 1
ElseIf I > 2 Then
Ch = Mid(Exp, I - 2, 1)
If Not (Ch >= "0" And Ch <= "9" Or Ch = ".") Then
I = I - 1
End If
End If
End If
End If
Else
J = I + 1
I = OperPosition + 1
End If
GetOpNum = Mid(Exp, I, J - I)
End Function
Private Function DirectCalValue(FirstV As String, SecondV As String, Op As String)
'用操作符计算两个操作数
Dim t1 As Double, t2 As Double
t1 = Val(FirstV): t2 = Val(SecondV)
Select Case Op
Case "+"
t1 = t1 + t2
Case "-"
t1 = t1 - t2
Case "*"
t1 = t1 * t2
Case "/"
t1 = t1 / t2
Case Else
Exit Function
End Select
DirectCalValue = CStr(t1)
End Function
Private Function FirstOperater(ByVal Exp As String) As Integer
'返回指定表达式字符串中下一步可最先计算的操作符位置
Dim P1 As Integer, P2 As Integer
P1 = InStr(Exp, "*")
P2 = InStr(Exp, "/")
GoSub SubFun
'从子程序返回,则没有 * / 符号
P1 = InStr(Exp, "+")
P2 = InStr(2, Exp, "-")
'从子程序返回,则没有 + - 符号
GoSub SubFun
FirstOperater = 0
Exit Function
SubFun:
If P1 * P2 = 0 Then
If P1 + P2 <> 0 Then
FirstOperater = P1 + P2
Exit Function
End If
Else
If P1 > P2 Then P1 = P2
FirstOperater = P1
Exit Function
End If
Return
End Function
'------------------------------------------------------------------
'******************计算字符串形式表达式结束************************
'------------------------------------------------------------------
Private Sub Command1_Click()Text2.Text = CalCulNext(Replace(Text1.Text, " ", ""))End Sub
Private Sub Command1_Click()
Text1.Text = Val(1 + 2 + 3)
Text2.Text = Text1.Text
End Sub