Форматирование числа с ведущими нулями в PHP

у меня есть переменная, которая содержит значение 1234567.

Я хотел бы, чтобы он содержал ровно 8 цифр, т. е. 01234567.

для этого есть функция PHP?

11 ответов


использовать sprintf :

sprintf('%08d', 1234567);

вы также можете использовать str_pad:

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

учитывая, что значение находится в $value:

  • Эхо:

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

  • чтобы получить его:

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

это должно сделать трюк


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

хотя я не совсем уверен, что вы хотите сделать, вы, вероятно, искали sprintf.

Это будет:

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

когда мне нужен 01 вместо 1, для меня сработало следующее:

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

sprintf это то, что вам нужно.

изменить (как-то запрошено downvotes), со страницы, связанной выше, Вот пример "нулевых целых чисел":

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

простой ответ

$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 или 8 цифр, вы также можете использовать

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

я провел несколько тестов и понял, что это будет вдвое быстрее, чем str_pad или sprintf.
Если вход может иметь любую длину, то вы также можете использовать

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

это не так быстро, как другой, но тоже должно быть немного быстрее, чем str_pad и sprintf.

Кстати: мой тест также сказал, что sprintf немного быстрее, чем str_pad. Я сделал все тесты с PHP 5.6.


Я написал эту простую функцию, чтобы создать этот формат: 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 

Это прекрасно работает:

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

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