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

513

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

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

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

Теги:
numbers
format

13 ответов

1067
Лучший ответ

Используйте sprintf:

sprintf('%08d', 1234567);

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

str_pad($value, 8, '0', STR_PAD_LEFT);
  • 45
    Просто хотел добавить: str_pad не вариант с отрицательными числами
  • 6
    Просто чтобы добавить к тому, что сказал wtf8_decode; Отрицательные числа не будут иметь ведущих нулей, и они не являются положительными числами. т. е. 08 будет записано как дата или что-то, что ожидает положительного двузначного числа (код сортировки банковского счета и т. д.). Пожалуйста, поправьте меня, если я ошибаюсь, но, насколько я знаю, в реальной жизни нет случая, чтобы требовать начального нуля для отрицательного значения?
Показать ещё 4 комментария
69

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

  • Чтобы повторить это:

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

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

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

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

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

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

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

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

Это будет:

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

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

РЕДАКТИРОВАТЬ (как-то запрошенными вниз), со страницы, указанной выше, здесь образец "нулевые полные числа":

<?php
    $isodate = sprintf("%04d-%02d-%02d", $year, $month, $day);
?>
  • 3
    Было бы лучше с примером или более подробным объяснением, чем просто ссылка на справочную страницу для sprintf ().
  • 1
    @jharrell не стесняйтесь редактировать :)
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);
6

Если номера ввода всегда содержат 7 или 8 цифр, вы также можете использовать

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

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

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

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

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

  • 0
    Спасибо, мне нравится ваш вариант, но вы думаете, что это должно быть $ str = (strlen ($ input) <8)? 0 $ input: $ input;
  • 0
    @JMX На самом деле оба способа работают нормально. (Рядом с моим отсутствующим $ я только что исправил)
2

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

Вы всегда можете злоупотреблять жонглированием:

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

Это не будет работать, как ожидалось, если 10 ** pad > INT_MAX или value >= 10 * pad.

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

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

$number = 13246;
echo sprintf( '%08d', $number );
  • 1
    Кажется, это просто повторение существующих ответов.
-2
$sl=1;    
while ($sl<13) {
       $str = ($sl < 10) ? 0 . $sl : $sl;
       $sql="SELECT login_time FROM hcm_attendance_".$str;
       $sl++;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню