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


601

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

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

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

Ответы:


1214

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

sprintf('%08d', 1234567);

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

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

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);

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




19

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

Это было бы:

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

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 цифрам


Спасибо, мне нравится ваш вариант, но вы думаете, что это должно быть $ 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 );

3
Кажется, это просто повторение существующих ответов.
Пан

-1

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

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

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


-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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.