在PHP中格式化带前导零的数字

我有一个包含值1234567的变量。

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

有这样的PHP函数吗?

694612 次浏览

sprintf就是你需要的。

EDIT(被反对者要求的),来自上面链接的页面,这是一个示例“零填充整数”:

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

假设值是$value:

  • 回声:

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

  • 得到它:

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

这样应该就行了

使用sprintf

sprintf('%08d', 1234567);

或者,您也可以使用str_pad

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

答案很简单

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

我不知道如何解释“它永远不会超过8位”的评论,以及它是指输入还是输出。如果它指的是输出,你必须有一个额外的substr()调用来剪辑字符串。

要剪掉前8位数字

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

剪掉最后8位数字

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

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

这将是:

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

如果输入数字总是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位数字

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

当我需要01而不是1时,以下方法对我有效:

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

我写了这个简单的函数来生成这种格式: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

你总是可以滥用类型杂耍:

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

如果10 ** pad > INT_MAXvalue >= 10 * pad,这将无法按预期工作。

$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