找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1164|回复: 2

[每日一码] String 格式替换

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-15 10:10:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
  1. ;; ~A 使用 vl-princ-to-string 替换
  2. ;; ~S 使用 vl-princ1-to-string 替换
  3. ;; ~D 整数
  4. ;; ~,num 使用 (rtos val 2 num) 替换
  5. ;; ~@ 列表替换
  6. ;;  stream 字串
  7. ;; dest -- t or nil , nil 返回替换后的 string
  8. ;; vals -- 对应的替换参数
  9. (defun cl:format (stream dest vals / txts dimzin)
  10.   (if (and (vl-symbolp stream)
  11.            (eq '-? stream)
  12.       )
  13.     (progn
  14.       (princ
  15.         (strcat
  16.           "Aufruf: (cl:format stream \"Destination-String\" '(values ...)\n"
  17.           "  stream  t            => Ausgabe auf Konsole\n"
  18.           "  stream  nil          => Rückgabe als String\n"
  19.           "  stream  #<File ...>  => Ausgabe in Datei\n\n"
  20.           "  Destination-String: \n"
  21.           "    jedes ~A wird durch die Ausgabe mit (vl-princ-to-string value) ersetzt\n"
  22.           "    jedes ~S wird durch die Ausgabe mit (vl-prin1-to-string value) ersetzt\n"
  23.           "    jedes ~D wird durch (itoa IntegerValue) ersetzt\n"
  24.           "    jedes ~,<Anzahl Stellen> wird durch (rtos numberValue 2 <Anzahl Stellen>) ersetzt\n"
  25.           "    jedes ~@ wird durch die Elemente der ValueList ersetzt\n"
  26.           "      (cl:format nil \"das sind meine kinder ~@\" '((Heike Gabi Manni)))\n"
  27.           "      => \"das sind meine kinder HEIKE GABI MANNI\"\n"
  28.           "Beispiel: (cl:format nil \n"
  29.           "                     \"~A hat eine Seitenl?nge von ~,3m und eine H?he von ~Dm\\nDas ergibt einen umbauten Raum von ~,3m3\"\n"
  30.           "                     (list \"Der Quader\" 2.5 4 (* 2.5 2.5 4)))\n"
  31.           "Ausgabe: \n\"Der Quader hat eine Seitenl?nge von 2.500m und eine H?he von 4m\nDas ergibt einen umbauten Raum von 25m3\"")
  32.       )
  33.       (prin1)
  34.     )
  35.     (progn
  36.       (setq dimzin (getvar "dimzin"))
  37.       (setvar "dimzin" 0)
  38.       (setq
  39.         txts ((lambda (vals defs txt / pos n cnt)
  40.                 (setq cnt 0
  41.                       pos 0
  42.                 )
  43.                 (while (setq pos (vl-string-position 126 txt pos))
  44.                   (setq n (strcase (substr txt (+ 2 pos) 1)))
  45.                   (cond        ((= n "A")
  46.                          (setq txt (vl-string-subst
  47.                                      (VL-PRINC-TO-STRING (nth cnt vals))
  48.                                      "~A"
  49.                                      txt
  50.                                      pos
  51.                                    )
  52.                                cnt (1+ cnt)
  53.                          )
  54.                         )
  55.                         ((= n "D")
  56.                          (setq txt (vl-string-subst
  57.                                      (itoa (nth cnt vals))
  58.                                      "~D"
  59.                                      txt
  60.                                      pos
  61.                                    )
  62.                                cnt (1+ cnt)
  63.                          )
  64.                         )
  65.                         ((= n "S")
  66.                          (setq txt (vl-string-subst
  67.                                      (VL-PRIN1-TO-STRING (nth cnt vals))
  68.                                      "~S"
  69.                                      txt
  70.                                      pos
  71.                                    )
  72.                                cnt (1+ cnt)
  73.                          )
  74.                         )
  75.                         ((= n ",")
  76.                          (setq txt (vl-string-subst
  77.                                      (rtos
  78.                                        (nth cnt vals)
  79.                                        2
  80.                                        (setq n (atoi (substr txt (+ 3 pos))))
  81.                                      )
  82.                                      (strcat "~," (itoa n))                                     
  83.                                      txt
  84.                                      pos
  85.                                    )
  86.                                cnt (1+ cnt)
  87.                          )
  88.                         )
  89.                         ((= n "@")
  90.                          (setq txt (vl-string-subst
  91.                                      (apply
  92.                                        'strcat
  93.                                        (mapcar
  94.                                          (function
  95.                                            (lambda (val)
  96.                                              (strcat (VL-PRIN1-TO-STRING val)
  97.                                                      " "
  98.                                              )
  99.                                            )
  100.                                          )
  101.                                          (nth cnt vals)
  102.                                        )
  103.                                      )
  104.                                      "~@"
  105.                                      txt
  106.                                      pos
  107.                                    )
  108.                                cnt (1+ cnt)
  109.                          )
  110.                         )
  111.                   )
  112.                 )
  113.                 txt
  114.               )
  115.                (cond ((atom vals) (list vals))
  116.                      ((vl-consp vals)
  117.                       vals
  118.                      )
  119.                      (t (list vals))
  120.                )
  121.                (mapcar 'type vals)
  122.                dest
  123.              )
  124.       )
  125.       (setvar "dimzin" dimzin)
  126.       (if stream
  127.         (if (= (type stream) 'file)
  128.           (princ txts stream)
  129.           (princ txts)
  130.         )
  131.         txts
  132.       )
  133.     )
  134.   )
  135. )

类似 WriteMessage 用法 WriteMessage("\nRow = {0}, Coloumn = {1}", row.ToString(), colomn.ToString());

_$ (cl:format nil "\n~A = ~,m" (list 'aaa  2 ))
"\nAAA = 2m"
_$ (cl:format nil "\n~A = ~,3m" (list 'aaa  2 ))
"\nAAA = 2.0003m"
_$
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2014-11-15 12:00:24 | 显示全部楼层
留存
  1. (defun fy:WriteMessage (msg lst / n n1 ll)
  2.   (if lst
  3.     (while (and (/= msg "") (setq n (vl-string-search "{" msg)))
  4.       (setq ll        (cons (substr msg 1 n) ll)
  5.             msg        (substr msg (+ 2 n))
  6.       )
  7.       (if (setq n1 (vl-string-search "}" msg))
  8.         (progn
  9.           (if (distof (vl-string-trim " " (substr msg 1 n1)))
  10.             (setq ll  (cons (car lst) ll)
  11.                   lst (cdr lst)
  12.                   msg (substr msg (+ n1 2))
  13.             )
  14.           )
  15.         )
  16.       )
  17.     )
  18.   )
  19.   (prompt (if ll
  20.             (apply 'strcat
  21.                    (mapcar '(lambda (x)
  22.                               (if (eq (type x) 'INT)
  23.                                 (itoa x)
  24.                                 (vl-princ-to-string x)
  25.                               )
  26.                             )
  27.                            (reverse ll)
  28.                    )
  29.             )
  30.             msg
  31.           )
  32.   )
  33. )

(fy:writemessage "\nTotle Length = { 0 }, Area =  { 1 }" '(1 2))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1094个

财富等级: 财源广进

发表于 2021-7-27 00:12:47 | 显示全部楼层
感谢楼主分享String 格式替换
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-4 22:38 , Processed in 0.367302 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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