明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2040|回复: 6

很久没有写代码,这个程序没有思路了,文本中数字提取并求和

[复制链接]
发表于 2013-4-27 18:34 | 显示全部楼层 |阅读模式
2明经币
本帖最后由 doremidai 于 2013-4-27 18:34 编辑

很久没有写代码,最近想写个“文本中数字提取并求和”的短程序,没有思路了,各位i老大帮帮忙。

下面的代码只能计算文本后面的文字,如何提取文本中部逗号前的文字,和过滤带括号的文本不参与计算?
  1. (print "文本数字求和(型如:N=23,N23.12,N=23.12,M=50.5,多行文字先炸开,不支持负数),命令:txtsum")
  2. (defun c:txtsum(/ all endno aa bb cc wz tha tsum i)
  3.   (if (null xzz) (setq xzz 0))
  4.   (setq ALL (ssget(list (cons 0 "text"))))
  5.   (if all (SETQ nn (SSLENGTH ALL)))
  6.   (setq endno 0)
  7.   (setq tsum 0 i 0)
  8.   (WHILE (and  (< endno nn) all)   
  9.     (setq aa (ssname all endno))
  10.     (setq bb (entget aa))
  11.     (setq cc(cdr(assoc 1 bb)))
  12.     (setq wz(rdata cc))
  13.     (setq tha(substr cc (+ wz 1) ( - (strlen cc) wz -1)))
  14.     (if (= tha "") (setq tha "0"))
  15.     (setq tsum(+ tsum (atof tha)))
  16.     (setq i(1+ i))
  17.     (print (strcat (itoa i) ":文本 <" cc ">---数字 <" tha ">"))
  18.     (setq endno (+ endno 1))
  19.   )
  20.   (print (strcat "共" (itoa i) "个文本,和=" (rtos tsum)))
  21.   (print)
  22. )
  23. ;;;
  24. (defun rdata(str / len i aa)
  25.   (if (> (strlen str) 0)
  26.     (progn
  27.            (setq i (strlen str))
  28.            (setq aa(substr str (strlen str) 1))
  29.      (while (and (or (and (>= aa "0") (<= aa "9"))
  30.          (= aa ".")      
  31.            )
  32.            (>= i 1)
  33.       )
  34.             (setq i(1- i))
  35.                   (if (>= i 1) (setq aa(substr str i 1)))
  36.            )      
  37.     )
  38.   )
  39.   (setq i i)
  40. )
附件: 您需要 登录 才可以下载或查看,没有账号?注册

点评

见二楼,对于弯矩也可以用二楼的代码直接提取(serch_number_e STR)  发表于 2013-4-28 09:59
发表于 2013-4-27 18:34 | 显示全部楼层
  1. (defun c:tt ()
  2.   (princ "\n选择含数字的对象:")
  3. ;;;对象选择集
  4.   (setq ss (ssget '((0 . "TEXT"))))
  5. ;;;将对象选择集转为图元名列表
  6.   (setq  ename-lst (vl-remove-if-not
  7.         '(lambda (x) (equal (type x) 'ename))
  8.         (mapcar 'cadr (ssnamex SS))
  9.       )
  10.   )
  11. ;;;过滤掉图元(字符串)中不含","的图元
  12.   (setq  ename-lst-1
  13.    (vl-remove-if-not
  14.      '(lambda (x)
  15.         (vl-string-search "," (cdr (assoc 1 (entget x))))
  16.       )
  17.      ename-lst
  18.    )
  19.   )
  20. ;;;获取","前数值列表
  21.   (setq  number-lst
  22.    (mapcar '(lambda (y)
  23.         (atof (vl-list->string
  24.           (vl-remove-if-not
  25.             '(lambda (x)
  26.          (and (> x 45) (< x 58))
  27.              )
  28.             (vl-string->list
  29.         (substr  (cdr (assoc 1 (entget y)))
  30.           1
  31.           (vl-string-search
  32.             ","
  33.             (cdr (assoc 1 (entget y)))
  34.           )
  35.         )
  36.             )
  37.           )
  38.         )
  39.         )
  40.       )
  41.      ename-lst-1
  42.    )
  43.   )
  44. ;;;求和
  45.   (setq num (apply '+ number-lst))
  46. )

点评

能不能帮改为获取","后数值列表!  发表于 2018-11-23 20:39
回复

使用道具 举报

发表于 2013-4-28 09:57 | 显示全部楼层
本帖最后由 夏生生 于 2013-4-28 10:10 编辑

对于提取括号前的数字代码如下
  1. ;;;判断字符串是否为实数
  2. (defun Number? (string /)
  3.   (if (or (= "." str)
  4.     (and (distof string)
  5.          (atof string)
  6.          (= (distof string) (atof string))
  7.     )
  8.       )
  9.     string
  10.   )
  11. )
  12. ;;;从尾部查找数字
  13. (defun serch_number_e (string / n st str)
  14.   (setq st "")
  15.   (if (null (Number? string))
  16.     (while (and  (setq n (strlen string))
  17.     (Number? (setq str (substr string n)))
  18.      )
  19.       (setq st (strcat str st))
  20.       (setq string (substr string 1 (1- n)))
  21.     )
  22.     (setq st string)
  23.   )
  24.   st
  25. )
  26. (SETQ STR "N=52774.123,M=12345.43")
  27. (serch_number_e(SUBSTR STR 1 (VL-STRING-SEARCH "," STR)))
  28. ;;-->"52774.123"
  29. (serch_number_e STR)
  30. ;;-->"12345.43"
回复

使用道具 举报

 楼主| 发表于 2013-4-28 16:44 | 显示全部楼层
感谢cie0588,解决问题。
把过滤的字符串改了一下就可以满足把数字也计算的要求了。
回复

使用道具 举报

发表于 2014-9-1 15:26 | 显示全部楼层
今天碰到了,特来学习学习。感谢各位朋友!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 23:00 , Processed in 0.274522 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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