左对齐零填充

5
有一个“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          "

1
右侧补零会改变数值,这个操作看起来并不实用。 - sds
你离上一个例子很接近了,但是你需要更多的逗号,因为填充字符是四个参数中的最后一个,而你正在将0作为第二个参数。 - Joshua Taylor
1
@sds 这可能取决于这些值是整数还是字符串,其中的值恰好是数字字符。我见过维护系统,在升级时更改了字段宽度和迁移旧记录的过程是使用0进行右填充。右填充正是因为它会改变值。000027(六个字符)可以写成27,它不是六个字符宽,而且000027也可能被意外读取(可能是由机器读取,当程序员不小心时)作为八进制。另一方面,270000必须是六位数字,并且不会是八进制,因为它不以0开头。 - Joshua Taylor
2个回答

6
你的最后一个例子很接近,但是你需要加上更多逗号,因为tilde less-than需要四个参数,而填充字符是第四个参数,但你却将其作为第二个参数传递了。只需将其作为第四个参数传递即可。
CL-USER> (format nil "~12,,,'0@<~d~>" 27)
"270000000000"

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

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

这可以使用~a完成,但是没有波浪线的小于号(OP已经在使用)也可以。 重要的部分(更多逗号)是相同的。 - Joshua Taylor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接