ps122hb 发表于 2018-3-26 16:22:18

请教lsp代码如何写?

请教一下各位怎么提取字符串里的数字,并转为数字型变量。
比如字符串为“1A2B3D44E5FFF6AAAA” 提取结果为:123456

lsp没写过,多谢各位。

ntwison 发表于 2018-3-26 20:55:30

每一个取出,然后用ASCII码确认

pengfei2010 发表于 2018-3-27 08:11:30

有比较多的方法,可以调用外部对象 正则表达式 获取,最简单的办法就是循环判断 字符串里面的每一个字符,用assic码判断 就行了,或者预设想要的字符表 例如 '( "1" "2" "3" "4" "5" "6" "7" "8" "9" "0" "."),用vl-position判断字符是否在这个表内 即可

ps122hb 发表于 2018-3-27 10:34:23

谢谢楼上2位,笨方法循环实现了

(setq str (getstring "\n输入:"))
;(print str)
(setq i 0
    s ""
       l (strlen str)
)
(repeat l
(setq a (substr str (setq i (1+ i)) 1)
   
)
   (setq ai(ascii a))   
(if (and (<= ai 57) (>= ai 48))
    (setq s (STRCAT s a))
)
)
(setq X (Atof s))

cabinsummer 发表于 2018-3-27 16:27:31

(setq a "1A2B3D44E5FFF6AAAA")
(vl-list->string (vl-remove-if '(lambda(x)(or (< x 48)(> x 57))) (vl-string->list a)))

llsheng_73 发表于 2018-3-27 17:29:15

如果里边有一些全角字符的话这样会出问题的

llsheng_73 发表于 2018-3-27 17:31:44

(defun StrType(a / b c d e);;字符串分离全角、符号、字母、数字,存在问题:连续小数点与数字相连不能精确分离数字和小数点
(setq b(vl-string->list a))
(while b
    (setq a(car b)b(cdr b)c(last d))
    (if(or(not d)
          (and(< 0 a 32)(< 0 c 32));;非打印字符
          (or(= 46 a)(= 46 c)(and(< 47 a 58)(< 47 c 58)));数字和小数点
          (vl-every'(lambda(x)(vl-some'(lambda(y)(<(car y)x(cadr y)))'((31 48)(57 65)(90 98)(122 129))))(list a c));其它字符包括小数点
          (vl-every'(lambda(x)(vl-some'(lambda(y)(<(car y)x(cadr y)))'((64 91)(96 123))))(list a c));;字母
          (and(> a 128)(> c 128)));;全角字符
      (if(> a 128)(setq d(vl-list*(car b)a d)b(cdr b))(setq d(cons a d)))
      (setq e(cons(reverse d)e)d(if(> a 128)(list(car b)a)(List a))b(if(> a 128)(cdr b)b))))
(mapcar'vl-list->string(reverse(cons(reverse d)e))))
(read(apply'strcat(vl-remove-if-not'distof(STRTYPE"1A2B3D44E5FFF6AAAA"))))
1234456
页: [1]
查看完整版本: 请教lsp代码如何写?