在PHP中使用前导零格式化数字

737

我有一个变量,它包含值 1234567

我希望它包含确切的8位数字,即01234567

是否有PHP函数可以实现这个目标?

11个回答

1484
使用sprintf
sprintf('%08d', 1234567);

或者你也可以使用str_pad函数:
str_pad($value, 8, '0', STR_PAD_LEFT);

70
注意:str_pad 对于负数不适用。 - wtf8_decode
6
补充一下wtf8_decode所说的内容:负数不会有前导零,并且它们不是正数。例如,08作为日期或需要正双位数字(如银行账户排序代码等)的东西将被写成它本身。请纠正我,如果我错了,但据我所知,在现实生活中不存在需要在负值上加前导零的情况? - guyver4mk
4
想要补充一下,sprintf('%+03d:00 UTC',$i) 中的 $i 取值范围为-12到12,将会根据需要打印出+或者-符号,并且对于位数少于两位数的数字也会添加前导零。非常适合在HTML中创建时区SELECT - Volomike
2
对于当前版本(7.1)及更低版本,sprintf(https://3v4l.org/junvv/perf#output)比`str_pad`(https://3v4l.org/cliNP/perf#output)稍微快一点。 - Vladyslav Startsev
2
负数何时需要前导零呢?例如三位数字的起飞计数器:T-010、T-009、T-008等。 - TRT 1968
显示剩余2条评论

97

当我需要使用01而不是1时,以下方法适用:

$number = 1;
$number = str_pad($number, 2, '0', STR_PAD_LEFT);

1
str_pad比sprintf更好。 - Trần Hữu Hiền

97

假设$value的值为:

  • 输出值:

    printf("%08d", $value);

  • 获取值:

    $formatted_value = sprintf("%08d", $value);

这样就可以了。


30
echo str_pad("1234567", 8, '0', STR_PAD_LEFT);

22

sprintf 是你需要的。

编辑(不知何故被踩了),从上面链接的页面中,这是一个样例“零填充整数”:

<?php
    $isodate = sprintf("%04d-%02d-%02d", $year, $month, $day);
?>

3
需要更多的例子或解释,而不仅仅是链接sprintf()函数的手册。 - jharrell

22

虽然我不太确定你想做什么,但你可能在寻找sprintf

这将是:

$value = sprintf( '%08d', 1234567 );

14

简单回答

$p = 1234567;
$p = sprintf("%08d",$p);
我不确定如何解释“它永远不会超过8位数字”的评论,以及它是指输入还是输出。如果它是指输出,你需要使用另一个substr()函数调用来截取字符串。
要截取前8个数字。
$p = substr(sprintf('%08d', $p),0,8);

截取最后8位数字

$p = substr(sprintf('%08d', $p),-8,8);

11

如果输入的数字始终是7或8位数,你也可以使用

$str = ($input < 10000000) ? 0 . $input : $input;

我运行了一些测试,并发现这个方法可以比使用str_padsprintf快两倍。


如果输入的长度可能是任意的,那么你也可以使用

$str = substr('00000000' . $input, -8);

这种方法虽然不如其他方法快,但应该比str_padsprintf都要快一点。

顺便说一下:我的测试还表明sprintfstr_pad稍微快一些。我用的是PHP 5.6进行的所有测试。

编辑:尽管substr版本在PHP 7.2中似乎仍然非常快,但如果您的输入长度超过您想要填充到的长度,则会出现问题。例如,您想要填充到3位数字,而您的输入有4位,则substr('0000'。'1234',-3)='234'只会得到最后3位数字。


谢谢,我喜欢你的变化,但我认为它应该是 $str = (strlen($input) < 8) ? 0 . $input : $input; - JMX
@JMX 实际上,两种方法都可以正常工作。(除了我刚刚修复的缺失的 $ - AbcAeffchen

3
$no_of_digit = 10;
$number = 123;

$length = strlen((string)$number);
for($i = $length;$i<$no_of_digit;$i++)
{
    $number = '0'.$number;
}

echo $number; ///////  result 0000000123

1
我写了这个简单的函数来生成这种格式:01:00:03。
秒总是显示(即使为零)。 如果分钟大于零或需要小时或天数,则显示分钟。 如果小时大于零或需要天数,则显示小时。 如果天数大于零,则显示天数。
function formatSeconds($secs) {
    $result = '';

    $seconds = intval($secs) % 60;
    $minutes = (intval($secs) / 60) % 60;
    $hours = (intval($secs) / 3600) % 24;
    $days = intval(intval($secs) / (3600*24));

    if ($days > 0) {
        $result = str_pad($days, 2, '0', STR_PAD_LEFT) . ':';
    } 

    if(($hours > 0) || ($result!="")) {
        $result .= str_pad($hours, 2, '0', STR_PAD_LEFT) . ':';
    } 

    if (($minutes > 0) || ($result!="")) {
        $result .= str_pad($minutes, 2, '0', STR_PAD_LEFT) . ':';
    } 

    //seconds aways shown
    $result .= str_pad($seconds, 2, '0', STR_PAD_LEFT); 

    return $result;

} //funct

例子:

示例:

echo formatSeconds(15); //15
echo formatSeconds(100); //01:40
echo formatSeconds(10800); //03:00:00 (mins shown even if zero)
echo formatSeconds(10000000); //115:17:46:40 

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