例如公式:(A+B)/C
我想把公式存储在数据库里面,并不是某一个字段为:(A+B)/C,而是这个公式是可以根据需要进行修改的,
也就是说需要吧(、)、+、-、*、/这些符号存储在数据库里,运算的时候形成公式。
如果这些符号按照字符的形式存储在数据库里面,形成的公式也是字符串,得不到最后的结果,请问如何解决这个问题。
我写的程序:
Dim Str_sql, F1, F2, F3, F4 As StringF1 = Asc("(")
F2 = Asc(")")
F3 = Asc("+")
F4 = Asc("/")
Str_sql = Chr(F1) & Val(Me.Text1.Text) & Chr(F3) & Val(Me.Text2.Text) & Chr(F2) & Chr(F4) & 10
Me.Text4.Text = Str_sql如果text1=10,text2=20,则得到字符串:(10+20)/10,得不到最后的结果3
我想把公式存储在数据库里面,并不是某一个字段为:(A+B)/C,而是这个公式是可以根据需要进行修改的,
也就是说需要吧(、)、+、-、*、/这些符号存储在数据库里,运算的时候形成公式。
如果这些符号按照字符的形式存储在数据库里面,形成的公式也是字符串,得不到最后的结果,请问如何解决这个问题。
我写的程序:
Dim Str_sql, F1, F2, F3, F4 As StringF1 = Asc("(")
F2 = Asc(")")
F3 = Asc("+")
F4 = Asc("/")
Str_sql = Chr(F1) & Val(Me.Text1.Text) & Chr(F3) & Val(Me.Text2.Text) & Chr(F2) & Chr(F4) & 10
Me.Text4.Text = Str_sql如果text1=10,text2=20,则得到字符串:(10+20)/10,得不到最后的结果3
解决方案 »
- VB如何编译成单独的exe文件
- 50分求助:如何使视频采集卡重新恢复最初设置?
- 有个问题我现在需要解决
- 自定义控件的高手请进,关于setwindowlong、sendmessage的问题。
- 招vb程序员
- 问一个关于Office2000 Outlook的问题。请高手指点
- 在XP下安装提示“找不到源文件”,怎么办?
- 请教:如何判断text文本框中的是不是日期型"yyyy-mm-dd mm:ss"
- SQL语句问题
- 字符集问题
- 在线等,谢谢高手
- 我用VB+MSDE2000练习编写了一个很简单的服务器端和客户端程序,我机器的ip为:192.168.0.101,我将服务器端放在192.168.0.102这台机器上并让数据库管理系统运行起来,我能够成功地连接上服务器端的数据库,也能够读写其数据库。但同样
假设我们要让使用者在“方程式”栏位中自由输入方程式,然后利用方程式进行计算,则引用ScriptControl控件可以很方便地做到。
( ScriptControl 控件附属于VB 6.0,如果安装后没有看到此一控件,可在光盘的 \Common\Tools\VB\Script 目录底下找此一控件, 其.文件名为Msscript.ocx。)
没有这个Msscript.ocx,可以到 微软网站下载
假设放在窗体上的ScriptControl控件名称为ScriptControl1,则在“计算”按钮的Click事件中编写如下代码:
Dim Statement As String
Statement = "X=" + Text1.Text + vbCrLf + "Y=" + Text2.Text + vbCrLf + ""
MsgBox "计算结果=" & ScriptControl1.ExecuteStatement( Statement )
F1 = Asc("(")
F2 = Asc(")")
F3 = Asc("+")
F4 = Asc("/")
Str_sql = Chr(F1) & Val(Me.Text1.Text) & Chr(F3) & Val(Me.Text2.Text) & Chr(F2) & Chr(F4) & 10 Me.Text4.Text = "select " & Str_sql
'一个Label1标签,一个命令按钮command1,一个文本框textbox
'比如:在文本框中输入(5+(1+2)*3)/4,结果为3.5
Private Sub Command1_Click()
Label1.Caption = MathCalculator(Text1.Text)
End SubPrivate 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
Option ExplicitPrivate Sub Command1_Click()
Dim strSql As String
strSql = "(" & Val(Text1) & "+" & Val(Text2) & ")/10"
MsgBox ScriptControl1.Eval(strSql)
End Sub