以Clojure格式(java.util.Formatter)、cl格式(Common Lisp格式)以编程方式控制填充?

以Clojure格式(java.util.Formatter)、cl格式(Common Lisp格式)以编程方式控制填充?,java,clojure,common-lisp,string-formatting,Java,Clojure,Common Lisp,String Formatting,有没有一种方法可以使用Clojureforrmat(基于java.util.Formatter)或cl格式(基于Common Lisp的格式)以编程方式设置空间填充?如果您事先知道所需的宽度,则这两个值都返回“foo”: 但是如果我想让程序决定返回的字符串应该有多宽呢?显然,我可以手工构造格式字符串,例如: (def width 6) (format (str "%" width "s") "foo") 但我记得有一个常见的Lispformat指令,它可以简单地将format参数的值插入for

有没有一种方法可以使用Clojure
forrmat
(基于
java.util.Formatter
)或
cl格式
(基于Common Lisp的
格式
)以编程方式设置空间填充?如果您事先知道所需的宽度,则这两个值都返回“foo”:

但是如果我想让程序决定返回的字符串应该有多宽呢?显然,我可以手工构造格式字符串,例如:

(def width 6)
(format (str "%" width "s") "foo")
但我记得有一个常见的Lisp
format
指令,它可以简单地将format参数的值插入format指令,然后使用生成的构造指令来处理下一个参数。但是,我还没有在or中找到这样的指令(这并不意味着信息不存在)。到目前为止,我在
java.util.Formatter
文档中也没有发现这样的指令。在这些格式化函数/类中,是否有方法使用指令控制指令

(我不确定我的
cl-format
示例是否有效,因为
d
是一个数字格式指令。它在Clojure 1.5.1中确实有效。同样的技巧也适用于具有
格式的CLISP,但不适用于SBCL、ABCL、CCL或ECL。)

编辑: (我发现左键填充字符串的正确方法是将
@
添加到
a
指令中,而不是使用
d

(clojure.pprint/cl-format nil "~6@a" "foo")

此方法应始终在Common Lisp中工作,通过在Clojure中使用
@a
而不是
d
,可以避免
cl格式的未来实现将改变
d
使用字符串的行为的风险,这是意外使用。)

在Common Lisp中,可以使用
v
作为前缀参数,例如:

(format nil "~vd" 10 42)
这里有记录:

可以使用V(或V)代替指令的前缀参数。在这种情况下,format将args中的参数作为指令的参数


杰出的那正是我想要的。我没有注意到Hyperspec页面上“v”的段落。同样的方法也适用于Clojure的
cl格式
(format nil "~vd" 10 42)