Office中国论坛/Access中国论坛

标题: 再谈Eval——关于计算器的那些事 [打印本页]

作者: roych    时间: 2023-5-14 19:48
标题: 再谈Eval——关于计算器的那些事
不久前,我遇到一个朋友,他说看到了一个Access短视频,里面有个函数,可以实时显示计算结果。我很奇怪,为什么会写这样的函数。他说,人最大的烦恼,就是不能随时实现愿望。如果什么愿望都能像这个函数一样,随时实现,你说多开心。这个函数本来打算发给你,现在看起来,我们得一起研究了。
  1. Function Calculate(s As String) As Long
  2.     Dim ops() As Long
  3.     ReDim ops(0)
  4.     ops(0) = 1

  5.     Dim sign As Long
  6.     sign = 1

  7.     Dim ret As Long
  8.     ret = 0
  9.    
  10.     Dim n As Long
  11.     n = Len(s)

  12.     Dim i As Long
  13.     i = 1

  14.     Do While i <= n
  15.         Select Case Mid(s, i, 1)
  16.         
  17.             Case " "
  18.                 i = i + 1
  19.             Case "+"
  20.                 sign = ops(UBound(ops))

  21.                 i = i + 1

  22.             Case "-"
  23.                 sign = -ops(UBound(ops))
  24.                 i = i + 1

  25.             Case "("

  26.                 ReDim Preserve ops(UBound(ops) + 1)

  27.                 ops(UBound(ops)) = sign

  28.                 i = i + 1

  29.             Case ")"

  30.                 ReDim Preserve ops(UBound(ops) - 1)

  31.                 i = i + 1

  32.             Case Else
  33.                 Dim num As Long
  34.                 num = 0

  35.                 Do While i <= n And IsNumeric(Mid(s, i, 1))

  36.                     num = num * 10 + CLng(Mid(s, i, 1))

  37.                     i = i + 1
  38.                 Loop
  39.                 ret = ret + sign * num
  40.         End Select
  41.     Loop

  42.     Calculate = ret

  43. End Function
复制代码
我看了一眼,虽然可以实时显示,但还是太复杂了。我很奇怪,为什么博主不用eval函数,而是非要使用数组?
关于eval函数,很久以前写过一个帖子,用于计算学杂费之类:
http://www.office-cn.net/thread-108898-1-1.html
在我看来,使用eval函数应该会更简单些。另外,考虑到只有加减法,根据加减法结合律,小括号对加减运算没任何影响,所以干脆去掉小括号的判定,于是有了这个简单版本:
  1. Function StrtoLong(ByVal strExpress As String) As Long
  2.     Dim strResult As String
  3.     '如果最后一个字符是运算符,剔除
  4.     If InStr(1, "+-*/^", Right(strExpress, 1)) Then
  5.         strResult = Left(strExpress, Len(strExpress) - 1)
  6.         
  7.     Else
  8.         strResult = strExpress
  9.     End If

  10.     StrtoLong = Eval(strResult)
  11. End Function
复制代码
写完这个,后来想想,既然非要使用小括号,那不如把乘、除和幂方也加上吧,便有了一个进阶版。
这里就不贴代码了。有需要的版友可以自行下载附件。
需要说明的是:

[attach]64552[/attach]


作者: huanghyd    时间: 2023-5-14 20:05
学习了,谢谢大神分享




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3