左对齐零填充

Ina*_*thi 4 common-lisp string-formatting

format有零填充数字的指令.

cl-user> (format nil "~12,'0d" 27)
"000000000027"
Run Code Online (Sandbox Code Playgroud)

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

cl-user> (format nil "~12@<~d~>" 27)
"27          "
Run Code Online (Sandbox Code Playgroud)

有办法做到这两点吗?那是:

cl-user> (format nil "~12,something,d" 27)
"270000000000"
Run Code Online (Sandbox Code Playgroud)

天真"~12,'0@<~d~>"似乎没有做我想要的.

cl-user> (format nil "~12,'0@<~d~>" 27)
"27          "
Run Code Online (Sandbox Code Playgroud)

Jos*_*lor 6

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

CL-USER> (format nil "~12,,,'0@<~d~>" 27)
"270000000000"
Run Code Online (Sandbox Code Playgroud)

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


sds*_*sds 5

用途~A:

(format nil "~33,,,'0A" 27)
==>  "270000000000000000000000000000000"
Run Code Online (Sandbox Code Playgroud)