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


600

我有一个包含值的变量1234567

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

是否有PHP函数呢?

Answers:


1212

用途sprintf

sprintf('%08d', 1234567);

另外,您也可以使用str_pad

str_pad($value, 8, '0', STR_PAD_LEFT);

54
只是想添加:str_pad不是带负数的选项
wtf8_decode 2015年

6
只是在wtf8_decode所说的内容之上添加;负数不会有前导零,并且它们也不是正数。即08将被写为诸如日期之类的东西,或者期望为正两位数的数字(银行帐户分类代码等)。如果我错了,请纠正我,但据我所知,在现实生活中,没有要求负数前导零的实例吗?
guyver4mk

3
想补充一点,sprintf('%+03d:00 UTC',$i)这里$i是-12至12日,将打印+或-根据需要,同时还将把前导零数少于2个位数。非常适合SELECT在HTML中创建时区。
Volomike

2
当前版本(7.1)和下部sprintf3v4l.org/junvv/perf#output)比得快一点str_pad3v4l.org/cliNP/perf#output
Vladyslav Startsev

负数何时可能需要前导零...一个三位数的提货柜台?T-010,T-009,T-008等
TRT 1968年

83

鉴于该值在$ value中:

  • 回显它:

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

  • 为拿到它,为实现它:

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

这应该够了吧




19

尽管我不确定自己要做什么,但是您可能正在寻找sprintf

这将是:

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

16

sprintf 是您所需要的。

在上面链接的页面中,编辑(按downvotes的要求),这是一个示例“零填充整数”:

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

3
除了简单地为sprintf()链接手册页以外,使用示例或更多说明会更好。
jharrell 2014年

13

简单的答案

$p = 1234567;
$p = sprintf("%08d",$p);

我不确定如何解释“永远不会超过8位”的注释,以及它是指输入还是输出。如果它引用输出,则必须有一个附加的substr()调用来裁剪字符串。

截断前8位数字

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

截断最后8位数字

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

7

如果输入数字始终为7或8位数字,则也可以使用

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

我进行了一些测试,得出的结果是速度是str_pad或的两倍sprintf
如果输入可以有任何长度,那么您也可以使用

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

这不如另一个快,但也应该比str_pad和快一点sprintf

顺便说一句:我的测试还说,sprintf它比快一点str_pad。我使用PHP 5.6进行了所有测试。

编辑:虽然该substr版本似乎仍然非常快(PHP 7.2),但如果您的输入可能比您要填充的长度更长,它也会被破坏。例如,您想填充到3位数字,而您的输入有4个比,substr('0000' . '1234', -3) = '234'只会导致最后3个数字


谢谢,我喜欢您的版本,但认为应该是$ str =(strlen($ input)<8)?0。$ input:$输入;
JMX

@JMX实际上,两种方法都可以正常工作。(除了我的失踪,$我刚刚解决了)
AbcAeffchen '16

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 

0
$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

这完美地工作:

$number = 13246;
echo sprintf( '%08d', $number );

3
这似乎只是现有答案的重复。

-1

您总是可以滥用类型的杂耍:

function zpad(int $value, int $pad): string {
    return substr(1, $value + 10 ** $pad);
}

如果10 ** pad > INT_MAX或,这将无法按预期工作value >= 10 * pad


-2
function duration($time){

    $hours = '';
    $minutes = '00:';
    $seconds = '00';

    if($time >= 3600){
        //0 - ~ hours
        $hours    = floor($time / 3600);
        $hours    = str_pad($hours, 2, '0', STR_PAD_LEFT) . ':';
        $time     = $time % 3600;
    }

    if($time >= 60){
        //0 - 60 minute     
        $minutes  = floor($time / 60);
        $minutes  = str_pad($minutes, 2, '0', STR_PAD_LEFT) . ':';
        $time     = $time % 60; 
    }

    if($time){
        //0 - 60 second
        $seconds  = str_pad($time, 2, '0', STR_PAD_LEFT);       
    }

    return $hours . $minutes . $seconds;

}

echo duration(59); // 00:59
echo duration(590); // 09:50
echo duration(5900); // 01:38:20
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.