gaics 发表于 2021-8-15 14:11:38

提取字符串中的数字,若有则返回实数

本帖最后由 gaics 于 2021-8-15 14:14 编辑

(defun ExtractNumbers (str / lst num i)
(setq lst (vl-string->list str))
(setq i 0)
(setq num "")
(repeat (length lst)
    (if(or (= (nth i lst) 46)
      (and (> (nth i lst) 47)
   (< (nth i lst) 58)
      )
)
      (setq num (strcat num (chr(nth i lst))))
    )
    (setq i (1+ i))
)
(if (= (strlen num) 0)
    (princ "未找到数字!")
    (atof num)
)
)
适合从字符串中提取出一组数字(含小数点),如“<正交 开> 80.0 <正交 关>”返回值是80.0。
如果是存在多组数值的情况,提取的结果可能无意义。

kkq0305 发表于 2021-8-15 15:51:28

本帖最后由 kkq0305 于 2021-8-16 16:05 编辑

写一个提取字符串文字的
(defun extstr (str / nstr)
(if (/= "" str)
    (if      (wcmatch str "#*")
      (cons (rtos (atof str) 2)
            (extstr (substr str (1+ (strlen (rtos (atof str) 2)))))
      )
      (progn
      (setq nstr "")
      (while (wcmatch str "[~1-9]*")
          (setq      nstr (strcat nstr (substr str 1 1))
                str(substr str 2)
          )
      )
      (cons nstr (extstr str))
      )
    )
)
)
如果要数字 则(mapcar 'atof (vl-remove-if-not '(lambda (x) (wcmatch x "#*")) (extstr str)))(setq str "Abcd80.0Edf95.63gHff")
(mapcar 'atof (vl-remove-if-not '(lambda (x) (wcmatch x "#*")) (extstr str)))

(80.0 95.63)

gaics 发表于 2021-8-16 14:47:19

(ExtractNumbers "Abcd80.0Edfg90.0Hff")
如果要得到所有数字 就把(atof num)改成num。

jinan1913 发表于 2021-8-16 14:31:54

(ExtractNumbers "Abcd80.0EdfgHff")
80.0
(ExtractNumbers "Abcd80.0Edfg90.0Hff")
80.09

(extstr "Abcd80.0EdfgHff")
("dcbA" "80" "ffHgfdE0.")

kkq0305 发表于 2021-8-16 15:59:31

jinan1913 发表于 2021-8-16 14:31
(ExtractNumbers "Abcd80.0EdfgHff")
80.0
(ExtractNumbers "Abcd80.0Edfg90.0Hff")


错误已在原楼修改{:1_1:}

20060510412 发表于 2021-8-20 09:37:19

http://bbs.mjtd.com/thread-180398-1-1.html
这个里面有提取数字的函数

vladimir 发表于 2022-2-4 10:43:56

非常不错的程序,谢谢分享

sandyvs 发表于 2023-4-15 11:00:26

kkq0305 发表于 2021-8-16 15:59
错误已在原楼修改

只有括号,会出错
(setq str "12.5(25.8)")
"12.5(25.8)"
(extstr str) ("12.5000" "." "8.0000")

magicheno 发表于 2023-8-3 02:59:08

感谢大佬分享
页: [1]
查看完整版本: 提取字符串中的数字,若有则返回实数