Форматування числа з провідними нулями в PHP


600

У мене є змінна, яка містить значення 1234567.

Я хотів би, щоб він містив рівно 8 цифр, тобто 01234567.

Чи є для цього функція PHP?

Відповіді:


1212

Використання 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.
Воломіке

2
для поточної версії (7.1) та нижчої sprintf( 3v4l.org/junvv/perf#output ) трохи швидше, ніж str_pad( 3v4l.org/cliNP/perf#output )
Владислав Старцев

Коли для від'ємного числа потрібен нульовий нульовий лічильник ... Лічильник зняття з трьома цифрами? T-010, T-009, T-008 тощо
TRT 1968

83

Враховуючи, що значення у $ value:

  • Щоб повторити це:

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

  • Щоб отримати його:

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

Це повинно зробити трюк




19

Хоча я не дуже впевнений, що ти хочеш зробити, ти, мабуть, шукаєш спринт .

Це було б:

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

16

sprintf це те, що вам потрібно.

EDIT ( якось запитується в нижній частині ) зі сторінки, що пов’язана вище, ось зразок "цілих цілих чисел":

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

3
Було б краще прикладом або більше поясненнями, а не просто посилання на довідкову сторінку для sprintf ().
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);

7

Якщо вхідні номери завжди мають 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.

Редагувати: Хоча 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.