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

601

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

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

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

Андромеда
источник

Ответы:

1214

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

sprintf('%08d', 1234567);

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

str_pad($value, 8, '0', STR_PAD_LEFT);
reko_t
источник
54
Просто хотел добавить: str_pad не вариант с отрицательными числами
wtf8_decode
6
Просто чтобы добавить к тому, что сказал wtf8_decode; Отрицательные числа не будут иметь ведущих нулей, и они не являются положительными числами. т. е. 08 будет записано как дата или что-то, что предполагает положительное двузначное число (код сортировки банковского счета и т. д.). Пожалуйста, поправьте меня, если я ошибаюсь, но, насколько я знаю, в реальной жизни нет случая, чтобы требовать начального нуля для отрицательного значения?
guyver4mk
3
Хотелось добавить, что sprintf('%+03d:00 UTC',$i)там , где от $i-12 до 12, будет печатать + или - по мере необходимости, а также ставит начальные нули для чисел менее 2 цифр. Отлично подходит для создания часового пояса SELECTв HTML.
Volomike
2
для текущей версии (7.1) и ниже sprintf( 3v4l.org/junvv/perf#output ) немного быстрее, чем str_pad( 3v4l.org/cliNP/perf#output )
Владислав Старцев
Когда для отрицательного числа может потребоваться начальный ноль ... Счетчик отрыва с тремя цифрами? Т-010, Т-009, Т-008 и т. Д.
TRT 1968,
83

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

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

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

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

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

Это должно делать свое дело

Kaze no Koe
источник
32

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

$number = 1;
$number = str_pad($number, 2, '0', STR_PAD_LEFT);
Г-н Шафикур Рахман
источник
19

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

Это было бы:

$value = sprintf( '%08d', 1234567 );
Huppie
источник
16

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

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

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

источник
3
Было бы лучше с примером или большим количеством объяснений, помимо простой ссылки на страницу руководства для sprintf ().
Джаррелл
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);
Питер Линдквист
источник
7

Если входные номера всегда имеют 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 цифрам

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

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

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

$number = 13246;
echo sprintf( '%08d', $number );
CZ рабочий
источник
3
Кажется, это просто повторение существующих ответов.
Пан
-1

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

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

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

jgmjgm
источник
-2
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
Ананд Кумар Праджапати
источник