Chinaunix首页 | 论坛 | 博客
  • 博客访问: 188607
  • 博文数量: 106
  • 博客积分: 3810
  • 博客等级: 中校
  • 技术积分: 1007
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-18 13:35
文章分类

全部博文(106)

文章存档

2014年(17)

2011年(5)

2010年(75)

2009年(9)

我的朋友

分类:

2010-04-29 23:05:32

'再发一个,非原创,作者不详,不到50行的单函数实现四则运算表达式计算求值.

'standard project
'all in module
Option Explicit

Private Function Eval(ByVal s As String) As Variant
  Dim Lb As Long, Rb As Long
  Lb = InStrRev(s, "(")
  While Lb <> 0
  Rb = InStr(Lb, s, ")")
  s = Replace(s, Mid$(s, Lb, Rb - Lb + 1), CStr(Eval(Mid$(s, Lb + 1, Rb - Lb - 1))))
  Lb = InStrRev(s, "(")
  Wend
  If IsNumeric(s) Then
  Eval = Val(s)
  Else
  Dim High As Long
  High = InStr(s, "+")
  If High <> 0 Then
  Eval = Eval(Left$(s, High - 1)) + Eval(Right$(s, Len(s) - High))
  Exit Function
  End If
  High = InStrRev(s, "-")
  If High <> 0 Then
  Eval = Eval(Left$(s, High - 1)) - Eval(Right$(s, Len(s) - High))
  Exit Function
  End If
  High = InStr(s, "*")
  If High <> 0 Then
  Eval = Eval(Left$(s, High - 1)) * Eval(Right$(s, Len(s) - High))
  Exit Function
  End If
  High = InStrRev(s, "/")
  If High <> 0 Then
  Eval = Eval(Left$(s, High - 1)) / Eval(Right$(s, Len(s) - High))
  Exit Function
  End If
  High = InStrRev(s, "%")
  If High <> 0 Then
  Eval = Eval(Left$(s, High - 1)) Mod Eval(Right$(s, Len(s) - High))
  Exit Function
  End If
  High = InStrRev(s, "!=")
  If High <> 0 Then
  Eval = Eval(Left$(s, High - 1)) <> Eval(Right$(s, Len(s) - High - 1))
  Exit Function
  End If
  High = InStrRev(s, "==")
  If High <> 0 Then
  Eval = (Eval(Left$(s, High - 1)) = Eval(Right$(s, Len(s) - High - 1)))
  Exit Function
  End If
  End If
End Function

'主函数
Public Sub main()
  Dim Expression As String
  Expression = "149.5+((100+(6+(90-5*2*2)*4+(1-1))+202)%441)*2*2+0.88+150.5"
  MsgBox Eval(Expression)
End Sub


阅读(432) | 评论(0) | 转发(0) |
0

上一篇:LOG记录器

下一篇:取汉字拼音首字母

给主人留下些什么吧!~~