我有一个包含值1234567的变量。
1234567
我希望它包含8位数字,即01234567。
01234567
有这样的PHP函数吗?
sprintf就是你需要的。
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
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_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位数字
substr
substr('0000' . '1234', -3) = '234'
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_MAX或value >= 10 * pad,这将无法按预期工作。
10 ** pad > INT_MAX
value >= 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