左对齐零填充

时间:2014-11-18 20:45:24

标签: common-lisp string-formatting

有一个format指令来填充数字。

cl-user> (format nil "~12,'0d" 27)
"000000000027"

并且有一个类似的指令,用于在填充字符串时对齐字符串

cl-user> (format nil "~12@<~d~>" 27)
"27          "

有两种方法可以做到吗?那就是:

cl-user> (format nil "~12,something,d" 27)
"270000000000"

幼稚的"~12,'0@<~d~>"似乎没有按照我的意愿行事。

cl-user> (format nil "~12,'0@<~d~>" 27)
"27          "

2 个答案:

答案 0 :(得分:6)

你接近最后一个例子,但是你需要更多的逗号,因为tilde less-than有四个参数,而pad char是第四个参数,但你将它作为传递给它第二。把它作为第四个传递给它:

CL-USER> (format nil "~12,,,'0@<~d~>" 27)
"270000000000"

顺便说一下,正确的填充是pointed out in the comments改变了看起来不是一个有用的操作的值。我说它可以是一个有用的操作。它可能取决于这些值是整数还是字符串,其值恰好是数字字符。我见过维护系统升级改变了字段宽度,迁移旧记录的过程是右边的0和0。正确的填充正是因为它改变了价值。 000027(六个字符)可以写成27,它不是六个字符宽,000027也可能被意外读取(可能是机器,当程序员不小心)作为八进制。另一方面,270000必须是六位数,并且不会是八进制的,因为它不是以0开头

答案 1 :(得分:5)

使用~A

(format nil "~33,,,'0A" 27)
==>  "270000000000000000000000000000000"