我想使用Perl的sprintf来对变量进行zerofill。
sprintf("%08d", $var);
但我想动态确定zerofill有多少位数。
如何使用名为sprintf("%08d", $var)
的变量替换$zerofill
中的“8”?
答案 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)
sprintf
和printf
支持*
表示法(至少自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);