明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1319|回复: 5

【K:AnalNum4STR】含数字的字符串排序(类似Windows排序)

[复制链接]
发表于 2023-12-4 21:43:33 | 显示全部楼层 |阅读模式
本帖最后由 kucha007 于 2023-12-4 22:45 编辑

该函数可在字符串的数字前面加"0",使得字符串中的数字部分强制满足位数
从而可以用于对文件名等含数字的字符串进行排序,排序结果类似Windows

该函数最早的灵感来自帖子:http://www.theswamp.org/index.php?topic=16564.0
我在这篇帖子思路的基础上,针对CAD高版本做了点优化,并且将字符串先拆分成单字再找数字。
在函数规整数字的过程中,我还去除了字符串中的空格和各种括号,这些对象一般也不用作排序依据
目前函数已经实际运用在这个程序中:http://bbs.mjtd.com/thread-188813-1-1.html


分享给大家,欢迎大家继续改进。
  1. ;分析字符串中的数字,强制满足位数并返回(在数字前加上0)
  2. (defun K:AnalNum4STR (Count STR / K:ExplodeSTR2One RtnSTR NumLst STRLst CurSTR TotNum TmpSTR)
  3.   ;将字符串拆分成单字符列表
  4.   (defun K:ExplodeSTR2One (STR / RtnSTR)
  5.     (while (> (strlen STR) 0)
  6.       (cond
  7.         ((> (ascii (substr STR 1 1)) 128) ;大于128为汉字
  8.           (if
  9.             (and
  10.               (>= (atoi (substr (ver) 13)) 2021)
  11.               (/= (getvar "lispsys") 0)
  12.             )
  13.             (progn
  14.               (setq RtnSTR (cons (substr STR 1 1) RtnSTR))
  15.               (setq STR (substr STR 2))
  16.             )
  17.             (progn
  18.               (setq RtnSTR (cons (substr STR 1 2) RtnSTR))
  19.               (setq STR (substr STR 3))
  20.             )
  21.           )
  22.         )
  23.         (T
  24.           (setq RtnSTR (cons (substr STR 1 1) RtnSTR))
  25.           (setq STR (substr STR 2))
  26.         )
  27.       )
  28.     )
  29.     (reverse RtnSTR)
  30.   )
  31.   (if (and STR (= 'STR (type STR)))
  32.       (progn
  33.           (setq RtnSTR ""
  34.                 NumLst (list "0" "1" "2" "3" "4" "5" "6" "7" "8" "9")
  35.                 STRLst (K:ExplodeSTR2One STR)
  36.           )
  37.           (while STRLst
  38.               (setq CurSTR (car STRLst)
  39.                     STRLst (cdr STRLst)
  40.               )
  41.               (if (member CurSTR NumLst);找到了数字
  42.                 (progn
  43.                     (setq TotNum 1);数字连续的次数
  44.                     (while (member (setq TmpSTR (car STRLst)) NumLst);下一个也是数字
  45.                           (setq TotNum (1+ TotNum)
  46.                                 STRLst (cdr STRLst)
  47.                                 CurSTR (strcat CurSTR TmpSTR)
  48.                           )
  49.                     )
  50.                     (repeat (- Count TotNum)
  51.                         (setq CurSTR (strcat "0" CurSTR))
  52.                     );不足位数前面加零
  53.                     (setq RtnSTR (strcat RtnSTR CurSTR))
  54.                 )
  55.                 (if (not (member CurSTR '(" " "(" ")" "(" ")" "[" "]" "{" "}" "【" "】")));移除空格和括号
  56.                     (setq RtnSTR (strcat RtnSTR CurSTR))
  57.                 )
  58.               )
  59.             )
  60.       )
  61.   )
  62.   RtnSTR
  63. )

函数用法:
  1. (K:AnalNum4STR 5 "PN375-A10.dwg")
  2. ;返回:"PN00375-A00010.dwg"


排序用法:
  1. ;假设我们的有一个表
  2. (setq DataLst (list "A9.DWG" "A1.DWG" "A10.DWG" "B11.DWG" "B2.DWG" "B05.DWG"))

  3. (setq DataLst (vl-sort DataLst '(lambda (x y) (< x y))))
  4. ;直接排序将得到错误的结果
  5. ;返回:("A1.DWG" "A10.DWG" "A9.DWG" "B05.DWG" "B11.DWG" "B2.DWG")

  6. (setq DataLst (vl-sort DataLst
  7.                        '(lambda (x y)
  8.                           (< (K:AnalNum4STR 5 x) (K:AnalNum4STR 5 y))
  9.                         )
  10.               )
  11. )
  12. ;使用函数处理后排序将得到我们想要的结果
  13. ;返回:("A1.DWG" "A9.DWG" "A10.DWG" "B2.DWG" "B05.DWG" "B11.DWG")










评分

参与人数 1明经币 +1 收起 理由
水洗可口可乐 + 1 很给力!

查看全部评分

发表于 2023-12-5 08:34:06 | 显示全部楼层
感谢分享,看上去很实用。。
发表于 2023-12-5 09:57:50 | 显示全部楼层
感谢分享,谢谢大佬发布新品。
发表于 2023-12-5 14:22:34 | 显示全部楼层
感谢大佬分享分享
发表于 2023-12-5 18:30:42 来自手机 | 显示全部楼层
微软应该是用红黑树实现的
发表于 2024-5-5 11:51:45 | 显示全部楼层
感谢楼主的分享,代码很好用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-28 02:58 , Processed in 0.179945 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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