明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 725|回复: 5

[讨论] 怎样提取运算符号两边的数字?

[复制链接]
发表于 2024-6-22 17:25:36 | 显示全部楼层 |阅读模式
5明经币
例如    “500/2” 或者“100*20”或者“300-100”或者“100+50”
就是这样有运算符号的字符串,提取两边的数字,两边数字长度不定。

 楼主| 发表于 2024-6-22 19:06:22 | 显示全部楼层
本帖最后由 qazxswk 于 2024-6-22 19:32 编辑

我自己想到一个方案,抛砖引玉,我本想通过这个代码,引入到一些需要输入数据的插件中,如拉伸、移动、偏移。希望大家提提建议。
现在,如果输入500*2,后面结果会得到1000。

  1. (defun c:tt(/ com n txt1 txt2 zhi)
  2. (setq com (getstring "\n输入数据:"))
  3. (if (or
  4. (if (setq n (vl-string-search "+" com))
  5. (progn
  6. (setq txt1 (substr com 1 n))
  7. (setq txt2 (substr com (+ n 2)))
  8. (setq zhi (+ (atof txt1) (atof txt2)))
  9. ))
  10. (if (setq n (vl-string-search "-" com))
  11. (progn
  12. (setq txt1 (substr com 1 n))
  13. (setq txt2 (substr com (+ n 2)))
  14. (setq zhi (- (atof txt1) (atof txt2)))
  15. ))
  16. (if (setq n (vl-string-search "*" com))
  17. (progn
  18. (setq txt1 (substr com 1 n))
  19. (setq txt2 (substr com (+ n 2)))
  20. (setq zhi (* (atof txt1) (atof txt2)))
  21. ))
  22. (if (setq n (vl-string-search "/" com))
  23. (progn
  24. (setq txt1 (substr com 1 n))
  25. (setq txt2 (substr com (+ n 2)))
  26. (setq zhi (/ (atof txt1) (atof txt2)))
  27. )))
  28. (princ (strcat "\n运算结果为:"(rtos zhi)))
  29. (princ (strcat "\n输入数值为:"com))
  30. )
  31. (princ))

回复

使用道具 举报

发表于 2024-6-22 20:43:34 | 显示全部楼层
如果是为了计算值  可以这样
(arxload "geomcal")
(cal "500/2")
(cal "100*20")
(cal "300-100")
(cal "100+50")

点评

这个好,非常实用,,,赞一个  发表于 2024-6-22 21:51
回复

使用道具 举报

发表于 2024-6-23 22:03:14 | 显示全部楼层
用正则表达式
;|
功能 对字符串进行正则表达式匹配测试.
参数:
pat = 正则表达式模式 ,对应vbs正则表达式的模式(expression)。说明: \\号要用\\\\替代.
str = 字符串
key = \"i\" \"g\" \"m\" , \"i\"不区分大小写(Ignorecase),\"g\"全局匹配(Global).
           \"m\"多行模式(Multiline),以上几个关键字可以组合使用,或用 \"\".
返回: 返回匹配的字符列表,或无一匹配返回nil

命令: (xd::string:regexps "\\d+\\.?\\d*" "100*20"  "") =>("100" "20")
命令: (xd::string:regexps "\\d+\\.?\\d*" "100.1+20"  "") =>("100.1" "20")
|;
(defun XD::String:RegExpS (pat str key / end keys matches x)
  (if (not *xxvbsexp)
    (setq *xxvbsexp (vlax-get-or-create-object "VBScript.RegExp"))
  )
  (vlax-put *xxvbsexp 'Pattern pat)
  (if (not key)
    (setq key "")
  )
  (setq key (strcase key))
  (setq keys '(("I" "IgnoreCase") ("G" "Global")
         ("M" "Multiline")
        )
  )
  (mapcar
    '(lambda (x)
       (if (wcmatch key (strcat "*" (car x) "*"))
         (vlax-put *xxvbsexp (read (cadr x)) 0)
         (vlax-put *xxvbsexp (read (cadr x)) -1)
       )
     )
    keys
  )
  (setq matches (vlax-invoke *xxvbsexp 'Execute str))
  (vlax-for x matches (setq end (cons (vla-get-value x) end)))
  (reverse end)
)
回复

使用道具 举报

发表于 2024-6-23 22:19:11 | 显示全部楼层
xiang19751218 发表于 2024-6-23 22:03
用正则表达式
;|
功能 对字符串进行正则表达式匹配测试.

Dijkstra算法,使用两个栈实现四则表达式的计算
https://v.douyin.com/i6F6N9TD/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 15:55 , Processed in 0.189195 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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