kucha007 发表于 2023-4-30 20:44:53

补齐字符串前导零+拆分字符串

本帖最后由 kucha007 于 2023-5-1 16:52 编辑

分享两个关于字符串的函数:


;补齐字符串前导零,强制满足位数
;作者不知道是谁了,也是明经上看到的
(defun K:AddZero4STR (STR Len)
(repeat (- Len (strlen STR))
    (setq STR (strcat "0" STR))
)
STR
)




;根据特殊符号分解文字为序号+内容两部分 by kucha
;Nam为序号识别的位数,如果在这个位数内找到特殊符号(" " "." "," "-" "_" "、")就拆分字符串。
;如果特殊符号出现多个或多次,则第一个符号之前的是序号,最后一个符号之后的是内容

(defun K:StepSTRSplit (Nam STR / ExpSTR NumSTR DeLst StepNum NewLst)
(progn
    ;将字符串拆分成单字符列表
    (defun K:ExplodeSTR (STR / Lst NewLst)
      (setq Lst (vl-string->list STR))
      (while
      (if (< (car Lst) 129) ;字符是否为单字节
          (setq NewLst (cons (chr (car Lst)) NewLst)
                Lst    (cdr Lst)
          );单字节为数字、字母、符号(ASCII表)
          (setq NewLst (cons (strcat (chr (car Lst)) (chr (cadr Lst))) NewLst)
                Lst    (cddr Lst)
          );双字节为汉字
      )
      )
      (reverse NewLst)
    )
    ;取出列表的前n项
    (defun K:TakeFirstN (Lst Nam / NewLst)
      (setq Nam (min Nam (length Lst)))
      (repeat Nam
      (setq NewLst (cons
                      (nth (setq Nam (1- Nam)) Lst)
                      NewLst
                  )
      )
      )
      NewLst
    )
    ;判断字符串是否只包含数字字符
    (defun K:IsValidNumSTR (STR / Lst Flag)
      (setq Lst (vl-STRing->list STR))
      (setq Flag T)
      (while (and Flag Lst)
      (if
          (and
            (>= (car Lst) 48)
            (<= (car Lst) 57)
          )
          (setq Lst (cdr Lst))
          (setq Flag nil)
      )
      )
      Flag
    )
)
(setq ExpSTR (K:ExplodeSTR STR))
(setq NumSTR (K:TakeFirstN ExpSTR Nam))
(if
    (and
      (setq DeLst (vl-remove-if-not'(lambda (x) (member x '(" " "." "," "-" "_" "、"))) NumSTR))
      (setq StepNum (apply 'strcat (K:TakeFirstN NumSTR (- (length NumSTR)(length (member (car DeLst) NumSTR))))))
      (K:IsValidNumSTR StepNum)
    )
    (progn
      (repeat
      (- (min Nam (length NumSTR))
          (vl-position (last DeLst)(reverse NumSTR))
      )
      (setq ExpSTR (cdr ExpSTR))
      )
      (setq NewLst (listStepNum(apply 'strcat ExpSTR) ))
    )
    (setq NewLst (list "" STR))
)
NewLst
)








bai2000 发表于 2023-5-1 09:29:25

是不是可以用这个画“250*600”的混凝土梁截面?

dokey 发表于 2023-5-4 09:51:54

加前导零,代码简洁,不错
页: [1]
查看完整版本: 补齐字符串前导零+拆分字符串