格式指令或一个衬垫来截断长字符串?

时间:2018-04-16 18:35:01

标签: common-lisp

我的用例是将列表列表作为表打印,列长度相等,所以我想截断长输入。是否有指令要这样做?也许是一个带有~[条件的单线程?

~a的论点允许填空:

    (format t "~10a***" "aaa")
aaa       ***
    ;; aaa       ***

完整打印长输入:

(format t "~10a***" "aaaaaaaaaaaaaaaaa")
;; aaaaaaaaaaaaaaaaa***

所以我在str:substring的帮助下这样做,其中start和end可以比列表大,而不会抛出错误(与subseq相反):

(ql:quickload "str")
(defvar mylist '(("header a" "header b")
                 ("col a" "col b")
                 ("much longer col a" "much longer col b")))
(mapcar (lambda (it)
          (format t "~10a | ~10a ~&" (str:substring 0 10 (first it)) 
                  (str:substring 0 10 (second it))))
        mylist)
header a   | header b   
col a      | col b      
much longe | much longe 

我不希望格式能够在截断的字符串中添加省略号(...),但这样会很好。

我在快速参考或here中找不到我要找的内容。

谢谢!

2 个答案:

答案 0 :(得分:3)

不是我知道,但您可以自己编写并使用Tilde Slash

答案 1 :(得分:0)

现在还有str:prune length string,它接受​​一个:ellipsis参数来告诉您如何切割字符串:

(mapcar (lambda (tuple)
                       (format t "~10a | ~10a~&" 
                               (str:prune 10 (first tuple) :ellipsis "…")
                               (str:prune 10 (second tuple) :ellipsis "…")))
                     mylist)
header a   | header b  
col a      | col b     
much long… | much long…

我们可以使用v指令不重复那么多列长度:

(defparameter *col-length* 10)

(mapcar (lambda (tuple)
           (format t "~va | ~va~&" 
                     *COL-LENGTH*
                     (str:prune *COL-LENGTH* (first tuple) :ellipsis "…")
                     *COL-LENGTH*
                     (str:prune *COL-LENGTH* (second tuple) :ellipsis "…")))
       mylist)
header a   | header b  
col a      | col b     
much long… | much long…

我们可以使用(let ((str:*ellipsis* "…") …)