明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 762|回复: 5

[提问] 数学表达式的字符串求值

[复制链接]
发表于 2019-6-9 12:38 | 显示全部楼层 |阅读模式
RT,有诸如此类的字符串(setq str "35*2+3"),如何对该字符串求值?
  1. ;;;  字符串仅含有加减乘除(+-*/),数字有可能有小数点
  2. ;;;  除此之外字符串内无其他特殊符号
  3. (setq str1 "35*2+1")
  4. (setq str2 "25+1.5*3")
  5. (setq str3 "25/5+35-3")

  6. ;;;  希望得到的结果
  7. (setq str1a 71)
  8. (setq str2a 29.5)
  9. (setq str3a 37)


发表于 2019-6-9 13:09 | 显示全部楼层
本帖最后由 1291500406 于 2019-10-11 19:31 编辑

cal 的bug: 整数必须介于 -32768 和 32767 之间,否则会计算错误的结果
VbScript_eval 可以弥补, cal的不足

VbScript表达式计算代码是如下
a = Eval(35*2+1)
b = Eval(25+1.5*3)
c = Eval(25/5+35-3)
msgbox "a="&a  & " b="&b& " c="&c


(defun VbScript_eval(expr)(or *SCR-ScriptControl(setq *SCR-ScriptControl

(vlax-create-object "Aec32BitAppServer.AecScriptControl.1"))
(setq *SCR-ScriptControl (vlax-create-object "ScriptControl")))
(vlax-put *SCR-ScriptControl 'language "VBScript")
(vlax-invoke *SCR-ScriptControl 'eval expr))


测试:
(setq str1a(VbScript_eval "35*2+1"))            
71
(setq str2a(VbScript_eval "25+1.5*3"))        
29.5
(setq str3a(VbScript_eval "25/5+35-3"))      
37.0
(setq str1a(VbScript_eval "35000000*2+1"))  
70000001



(setq str1a(cal "35*2+1"))     
71
(setq str2a(cal "25+1.5*3"))  
29.5
(setq str3a(cal "25/5+35-3"))
37.0
(setq str1 (cal "35000000*2+1"))
7553



评分

参与人数 2明经币 +2 收起 理由
菜卷鱼 + 1 赞一个!
masterlong + 1 赞一个!

查看全部评分

回复 支持 2 反对 0

使用道具 举报

发表于 2019-6-9 12:52 | 显示全部楼层
(cal ".....")
 楼主| 发表于 2019-6-9 14:56 | 显示全部楼层
1291500406 发表于 2019-6-9 13:09
cal 的bug: 整数必须介于 -32768 和 32767 之间,否则会计算错误的结果
VbScript_[/backcol ...

犀利,不过我这里提示变量保护了。所以我将下面的红色的eval换成其他变量了,这样子也貌似运行正常。可以吗?会不会有潜在的其他影响?
(defun VbScript_eval (expr / eval)
  (or *SCR-ScriptControl
      (setq *SCR-ScriptControl
             (vlax-create-object "Aec32BitAppServer.AecScriptControl.1")
      )
      (setq *SCR-ScriptControl (vlax-create-object "ScriptControl"))
  )
  (vlax-put *SCR-ScriptControl 'language "VBScript")
  (setq eval (vlax-invoke *SCR-ScriptControl 'eval expr))
)
发表于 2019-6-9 15:07 | 显示全部楼层
本帖最后由 1291500406 于 2019-6-9 15:08 编辑
sysu-沼泽 发表于 2019-6-9 14:56
犀利,不过我这里提示变量保护了。所以我将下面的红色的eval换成其他变量了,这样子也貌似运行正常。可以 ...

只要得到返回值就行,
 楼主| 发表于 2019-6-9 15:12 | 显示全部楼层
1291500406 发表于 2019-6-9 15:07
只要得到返回值就行,

好,多谢指导!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-3-29 07:22 , Processed in 0.251146 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表