明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1081|回复: 2

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

  [复制链接]
发表于 2023-4-30 20:44:53 | 显示全部楼层 |阅读模式
本帖最后由 kucha007 于 2023-5-1 16:52 编辑

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

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



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

  4. (defun K:StepSTRSplit (Nam STR / ExpSTR NumSTR DeLst StepNum NewLst)
  5.   (progn
  6.     ;将字符串拆分成单字符列表
  7.     (defun K:ExplodeSTR (STR / Lst NewLst)
  8.       (setq Lst (vl-string->list STR))
  9.       (while
  10.         (if (< (car Lst) 129) ;字符是否为单字节
  11.           (setq NewLst (cons (chr (car Lst)) NewLst)
  12.                 Lst    (cdr Lst)
  13.           );单字节为数字、字母、符号(ASCII表)
  14.           (setq NewLst (cons (strcat (chr (car Lst)) (chr (cadr Lst))) NewLst)
  15.                 Lst    (cddr Lst)
  16.           );双字节为汉字
  17.         )
  18.       )
  19.       (reverse NewLst)
  20.     )
  21.     ;取出列表的前n项
  22.     (defun K:TakeFirstN (Lst Nam / NewLst)
  23.       (setq Nam (min Nam (length Lst)))
  24.       (repeat Nam
  25.         (setq NewLst (cons
  26.                       (nth (setq Nam (1- Nam)) Lst)
  27.                       NewLst
  28.                     )
  29.         )
  30.       )
  31.       NewLst
  32.     )
  33.     ;判断字符串是否只包含数字字符
  34.     (defun K:IsValidNumSTR (STR / Lst Flag)
  35.       (setq Lst (vl-STRing->list STR))
  36.       (setq Flag T)
  37.       (while (and Flag Lst)
  38.         (if
  39.           (and
  40.             (>= (car Lst) 48)
  41.             (<= (car Lst) 57)
  42.           )
  43.           (setq Lst (cdr Lst))
  44.           (setq Flag nil)
  45.         )
  46.       )
  47.       Flag
  48.     )
  49.   )
  50.   (setq ExpSTR (K:ExplodeSTR STR))
  51.   (setq NumSTR (K:TakeFirstN ExpSTR Nam))
  52.   (if
  53.     (and
  54.       (setq DeLst (vl-remove-if-not  '(lambda (x) (member x '(" " "." "," "-" "_" "、"))) NumSTR))
  55.       (setq StepNum (apply 'strcat (K:TakeFirstN NumSTR (- (length NumSTR)(length (member (car DeLst) NumSTR))))))
  56.       (K:IsValidNumSTR StepNum)
  57.     )
  58.     (progn
  59.       (repeat
  60.         (- (min Nam (length NumSTR))
  61.           (vl-position (last DeLst)(reverse NumSTR))
  62.         )
  63.         (setq ExpSTR (cdr ExpSTR))
  64.       )
  65.       (setq NewLst (list  StepNum(apply 'strcat ExpSTR) ))
  66.     )
  67.     (setq NewLst (list "" STR))
  68.   )
  69.   NewLst
  70. )








发表于 2023-5-1 09:29:25 | 显示全部楼层
是不是可以用这个画“250*600”的混凝土梁截面?
发表于 2023-5-4 09:51:54 | 显示全部楼层
加前导零,代码简洁,不错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-16 20:47 , Processed in 0.155344 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表