【发布时间】:2010-12-14 13:43:14
【问题描述】:
我有一个包含值 1234567 的变量。
我希望它恰好包含 8 位数字,即01234567。
有 PHP 函数吗?
【问题讨论】:
我有一个包含值 1234567 的变量。
我希望它恰好包含 8 位数字,即01234567。
有 PHP 函数吗?
【问题讨论】:
如果输入的数字始终为 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 位数字
【讨论】:
$我刚刚修复)
$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
【讨论】:
你总是可以滥用类型杂耍:
function zpad(int $value, int $pad): string {
return substr(1, $value + 10 ** $pad);
}
如果是10 ** pad > INT_MAX 或value >= 10 * pad,这将无法正常工作。
【讨论】:
当我需要 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
【讨论】:
【讨论】:
sprintf('%+03d:00 UTC',$i),其中$i 是-12 到12,将根据需要打印+ 或-,并且还会为小于2 位的数字添加前导零。非常适合在 HTML 中创建时区 SELECT。
sprintf(3v4l.org/junvv/perf#output) 比 str_pad(3v4l.org/cliNP/perf#output) 快一点
假设值在 $value 中:
回应它:
printf("%08d", $value);
得到它:
$formatted_value = sprintf("%08d", $value);
这应该可以解决问题
【讨论】:
sprintf 是您所需要的。
编辑(以某种方式被否决票要求),来自上面链接的页面,这是一个示例“零填充整数”:
<?php
$isodate = sprintf("%04d-%02d-%02d", $year, $month, $day);
?>
【讨论】:
echo str_pad("1234567", 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);
【讨论】: