6

我想使用 Perl 的sprintf来对变量进行零填充。

sprintf("%08d", $var);

但我想动态确定要填零的位数。

如何sprintf("%08d", $var)用名为的变量替换“8” $zerofill

4

3 回答 3

15

sprintf的第一个参数只是一个字符串:

 my $zerofill = 9;
 my $number = 1000;
 my $filled = sprintf "%0${zerofill}d", $number;

请注意大括号将变量名称与字符串的其余部分分开。

我们有这个特殊的问题作为学习 Perl中的一个稍微聪明的练习,以提醒人们字符串只是字符串。:)

但是,正如mobrule 在他的回答中指出的那样, sprintf 有许多功能可以为您提供这种灵活性。这样一个看似简单的函数的文档很长,里面有很多好东西。

于 2010-03-18T16:01:17.647 回答
15

sprintfprintf支持*符号(这至少从 5.8 开始有效):


printf "%0*d", 9, 12345;

000012345

printf '$%*.*f', 8, 2, 456.78;

$  456.78
于 2010-03-18T16:06:00.970 回答
2

我需要做一些稍微不同的事情:零填充浮点值并获得准确的长度。

在我的情况下,我需要 12 个字节,包括小数点。它比你上面的要复杂一些。这是以防万一有人需要这个:

假设 $inputVal 是从某处传入的字符串,其值类似于1001.1。请注意,它应该少于 12 个字符才能可靠地工作

 # This will give us extra zeros, but the string may be too long
 my $floatVal = sprintf('%*.*f', 12, 12, $inputValue);

 # This will remove any extra zeros
 $result = substr($floatVal, 0, 12);
于 2011-08-25T00:41:49.227 回答