如何在Perl中使用sprintf在右侧添加填充零?

时间:2015-08-20 08:03:44

标签: perl

我想使用sprintf将零填充到给定数字的右侧。

示例:如果数字是0715,那么我想在右边填充零,创建一个新的六位数字:

Input-->0715
Output-->071500

5 个答案:

答案 0 :(得分:2)

您无法使用sprintf执行此操作,因为如果您这样做,那么您将更改所显示数字的值 - 这不是格式化。如果您将数字视为数值,也不能这样做。

您需要将数字的长度作为字符串进行测试,并附加零:

my $num_str = "0715";
my $length  = 6 - length($num_str);
print $num_str , "0" x $length;

答案 1 :(得分:1)

您也可以使用substr执行此操作。附加六个0并获取从0th6th索引的字符串。但很明显,Sobrique说你无法将其视为数字。

my $num = '0715';
print substr $num.'0'x6,0,6;

答案 2 :(得分:1)

my $num='0715';
$num.='0'x( 6 - length $num);
print "$num";

答案 3 :(得分:1)

space prefix non-negative number with a space + prefix non-negative number with a plus sign - left-justify within the field 0 use zeros, not spaces, to right-justify # ensure the leading "0" for any octal, prefix non-zero hexadecimal with "0x" or "0X", prefix non-zero binary with "0b" or "0B" 没有模式来格式化用零而不是空格左对齐的字符串。

这些是How to set date of datepicker that displays Month and Year only列出的所有标志:

sprintf

如果您坚持使用-,则必须在字段中使用/r左对齐,这会在右侧显示空格。然后你需要将它们更改为零。您可以使用perldoc执行此操作。我使用带有tr///修饰符的较短格式,使$foo返回值,而不是仅更改左值my $foo = '0715'; print sprintf('%-6s', $foo) =~ tr/ /0/r;

071500

<强>输出:

db.collection.mapReduce(
    function() {
        var obj = { "daily": this.daily, "hourly": {} };
        for ( var x=0; x <= 23; x++ ) {
            obj.hourly[x] = 0;
        }

        var hourly = this.hourly;
        Object.keys(hourly).forEach(function(hour) {
            obj.hourly[hour] += hourly[hour];
        });
        emit(null, obj);
    },
    function(key,values) {
        var obj = { "daily": 0, "hourly": {} };
        for ( var x=0; x <= 23; x++ ) {
            obj.hourly[x] = 0;
        }

        values.forEach(function(value) {
            obj.daily += value.daily;
            Object.keys(value.hourly).forEach(function(hour) {
                obj.hourly[hour] += value.hourly[hour];
            });
        });
        return obj;
    },
    { "out": { "inline": 1 } }
)

答案 4 :(得分:0)

众所周知,您可以使用print(sprintf("%010s", "hello!"));轻松地向左执行此操作,以获取0000hello!。为什么不进一步使用该过程呢?这是在perl中使用sprintf()进行此操作的另一种方法-只需使用适当的scalar()reverse()调用,就可以了:

gitter channel

设置数字和我们的打击垫长度:

my $var = "0715";
my $padlength = 6;

反转字符串,将其sprintf格式化,然后反转:

my $formatted = reverse(sprintf("%0" . $padlength . "s", scalar(reverse($var))));
print($formatted);

结果令人满意:

071500