如何在Perl中使用sprintf将填充填充为可变长度?

时间:2010-03-18 15:58:08

标签: perl printf zerofill

我想使用Perl的sprintf来对变量进行zerofill。

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

但我想动态确定zerofill有多少位数。

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

3 个答案:

答案 0 :(得分:15)

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

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

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

我们将此特定问题作为Learning Perl中的一个稍微聪明的练习来提醒人们字符串只是字符串。 :)

但是,作为mobrule points out in his answer,sprintf具有许多功能,可以为您提供这种灵活性。这个看似简单的功能的文档很长,并且有很多好东西。

答案 1 :(得分:15)

sprintfprintf支持*表示法(至少自5.8起已有效):


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

000012345

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

$  456.78

答案 2 :(得分: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);