很久没有写代码,这个程序没有思路了,文本中数字提取并求和
本帖最后由 doremidai 于 2013-4-27 18:34 编辑很久没有写代码,最近想写个“文本中数字提取并求和”的短程序,没有思路了,各位i老大帮帮忙。
下面的代码只能计算文本后面的文字,如何提取文本中部逗号前的文字,和过滤带括号的文本不参与计算?(print "文本数字求和(型如:N=23,N23.12,N=23.12,M=50.5,多行文字先炸开,不支持负数),命令:txtsum")
(defun c:txtsum(/ all endno aa bb cc wz tha tsum i)
(if (null xzz) (setq xzz 0))
(setq ALL (ssget(list (cons 0 "text"))))
(if all (SETQ nn (SSLENGTH ALL)))
(setq endno 0)
(setq tsum 0 i 0)
(WHILE (and(< endno nn) all)
(setq aa (ssname all endno))
(setq bb (entget aa))
(setq cc(cdr(assoc 1 bb)))
(setq wz(rdata cc))
(setq tha(substr cc (+ wz 1) ( - (strlen cc) wz -1)))
(if (= tha "") (setq tha "0"))
(setq tsum(+ tsum (atof tha)))
(setq i(1+ i))
(print (strcat (itoa i) ":文本 <" cc ">---数字 <" tha ">"))
(setq endno (+ endno 1))
)
(print (strcat "共" (itoa i) "个文本,和=" (rtos tsum)))
(print)
)
;;;
(defun rdata(str / len i aa)
(if (> (strlen str) 0)
(progn
(setq i (strlen str))
(setq aa(substr str (strlen str) 1))
(while (and (or (and (>= aa "0") (<= aa "9"))
(= aa ".")
)
(>= i 1)
)
(setq i(1- i))
(if (>= i 1) (setq aa(substr str i 1)))
)
)
)
(setq i i)
) (defun c:tt ()
(princ "\n选择含数字的对象:")
;;;对象选择集
(setq ss (ssget '((0 . "TEXT"))))
;;;将对象选择集转为图元名列表
(setqename-lst (vl-remove-if-not
'(lambda (x) (equal (type x) 'ename))
(mapcar 'cadr (ssnamex SS))
)
)
;;;过滤掉图元(字符串)中不含","的图元
(setqename-lst-1
(vl-remove-if-not
'(lambda (x)
(vl-string-search "," (cdr (assoc 1 (entget x))))
)
ename-lst
)
)
;;;获取","前数值列表
(setqnumber-lst
(mapcar '(lambda (y)
(atof (vl-list->string
(vl-remove-if-not
'(lambda (x)
(and (> x 45) (< x 58))
)
(vl-string->list
(substr(cdr (assoc 1 (entget y)))
1
(vl-string-search
","
(cdr (assoc 1 (entget y)))
)
)
)
)
)
)
)
ename-lst-1
)
)
;;;求和
(setq num (apply '+ number-lst))
) 本帖最后由 夏生生 于 2013-4-28 10:10 编辑
对于提取括号前的数字代码如下;;;判断字符串是否为实数
(defun Number? (string /)
(if (or (= "." str)
(and (distof string)
(atof string)
(= (distof string) (atof string))
)
)
string
)
)
;;;从尾部查找数字
(defun serch_number_e (string / n st str)
(setq st "")
(if (null (Number? string))
(while (and(setq n (strlen string))
(Number? (setq str (substr string n)))
)
(setq st (strcat str st))
(setq string (substr string 1 (1- n)))
)
(setq st string)
)
st
)
(SETQ STR "N=52774.123,M=12345.43")
(serch_number_e(SUBSTR STR 1 (VL-STRING-SEARCH "," STR)))
;;-->"52774.123"
(serch_number_e STR)
;;-->"12345.43" 感谢cie0588,解决问题。
把过滤的字符串改了一下就可以满足把数字也计算的要求了。 今天碰到了,特来学习学习。感谢各位朋友!
页:
[1]