doremidai 发表于 2013-4-27 18:34:55

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

本帖最后由 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)
)

cie0588 发表于 2013-4-27 18:34:56

(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 09:57:21

本帖最后由 夏生生 于 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"

doremidai 发表于 2013-4-28 16:44:00

感谢cie0588,解决问题。
把过滤的字符串改了一下就可以满足把数字也计算的要求了。

434939575 发表于 2014-9-1 15:26:14

今天碰到了,特来学习学习。感谢各位朋友!
页: [1]
查看完整版本: 很久没有写代码,这个程序没有思路了,文本中数字提取并求和