有没有办法使用Clojure forrmat
(基于java.util.Formatter
)或cl-format
(基于Common Lisp的format
)以编程方式设置空间填充?如果您事先知道所需的宽度,则返回" foo"
:
(format "%6s" "foo")
(clojure.pprint/cl-format nil "~6d" "foo")
但是,如果我希望程序决定返回的字符串应该有多宽,该怎么办?显然我可以手工构造格式字符串,例如:
(def width 6)
(format (str "%" width "s") "foo")
但是我想我记得有一个Common Lisp format
指令可以简单地将format参数的值插入到format指令中,然后使用生成的construct指令来处理下一个参数。但是,我还没有在CL Hyperspec或CLTL2中找到这样的指令(这并不意味着信息不存在)。到目前为止,我还没有在java.util.Formatter
文档中发现这样的指令。有没有办法在任何这些格式化函数/类中控制带有指令的指令?
(我不确定我的cl-format
示例是否应该起作用,因为d
是一个数字格式化指令。它在Clojure 1.5.1中有效。同样的技巧在CLISP中起作用format
,但不包括SBCL,ABCL,CCL或ECL。)
编辑:
(我发现左边填充字符串的正确方法是将@
添加到a
指令,而不是使用d
:
(clojure.pprint/cl-format nil "~6@a" "foo")
此方法应该始终在Common Lisp中使用,并且在Clojure中使用@a
而不是d
,可以避免将来cl-format
的实现会改变d
的行为的风险{1}}使用字符串,这是一种无意的用法。)
答案 0 :(得分:3)
在Common Lisp中,您可以使用v
作为前缀参数,例如:
(format nil "~vd" 10 42)
这里记录了:http://clhs.lisp.se/Body/22_c.htm
代替指令的前缀参数,可以使用V(或v)。在这种情况下,format将args中的参数作为指令的参数。