Formatowanie liczby z wiodącymi zerami w PHP

Mam zmienną, która zawiera wartość 1234567.

Chciałbym, aby zawierała dokładnie 8 cyfr, czyli 01234567.

Czy istnieje do tego funkcja PHP?

Author: User that is not a user, 2009-11-09

11 answers

Użycie sprintf :

sprintf('%08d', 1234567);

Alternatywnie można również użyć str_pad:

str_pad($value, 8, '0', STR_PAD_LEFT);
 967
Author: reko_t,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-29 14:16:34

Biorąc pod uwagę, że wartość jest w $value:

  • Aby go odtworzyć:

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

  • Aby go zdobyć:

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

That should do the trick

 71
Author: Kaze no Koe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-22 13:29:34
echo str_pad("1234567", 8, '0', STR_PAD_LEFT);
 19
Author: joan16v,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-16 08:33:42

Chociaż nie jestem do końca pewien, co chcesz zrobić, prawdopodobnie szukasz sprintf .

To będzie:

$value = sprintf( '%08d', 1234567 );
 17
Author: Huppie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-10 07:31:01

Gdy potrzebowałem 01 zamiast 1, zadziałało dla mnie:

$number = 1;
$number = str_pad($number, 2, '0', STR_PAD_LEFT);
 17
Author: Md. Shafiqur Rahman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-16 06:30:34

sprintf tego potrzebujesz.

EDIT (), ze strony podlinkowanej powyżej, oto przykład "zero-padded integers":

<?php
    $isodate = sprintf("%04d-%02d-%02d", $year, $month, $day);
?>
 14
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-13 17:21:06

Prosta odpowiedź

$p = 1234567;
$p = sprintf("%08d",$p);

Nie jestem pewien, jak zinterpretować komentarz mówiący "nigdy nie będzie więcej niż 8 cyfr" i czy odnosi się do wejścia lub wyjścia. Jeśli odnosi się do wyjścia, musisz mieć dodatkowe wywołanie substr (), aby przyciąć łańcuch.

Aby przypiąć pierwsze 8 cyfr

$p = substr(sprintf('%08d', $p),0,8);

Aby przypiąć ostatnie 8 cyfr

$p = substr(sprintf('%08d', $p),-8,8);
 13
Author: Peter Lindqvist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-09 14:36:15

Jeśli liczby wejściowe mają zawsze 7 lub 8 cyfr, możesz również użyć

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

Przeprowadziłem kilka testów i doszedłem do wniosku, że to będzie dwa razy szybsze niż str_pad lub sprintf.
Jeśli wejście może mieć dowolną długość, Możesz również użyć

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

Nie jest tak szybki jak drugi, ale powinien być również trochę szybszy niż str_pad i sprintf.

Btw: mój test również powiedział, że sprintf jest trochę szybszy niż str_pad. Wszystkie testy wykonałem z PHP 5.6.

 5
Author: AbcAeffchen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-06 19:03:48

Napisałem tę prostą funkcję do wytworzenia tego formatu: 01: 00: 03

Sekundy są zawsze wyświetlane (nawet jeśli zero). Minuty są wyświetlane, jeśli są większe niż zero lub jeśli wymagane są godziny lub dni. Godziny są wyświetlane, jeśli są większe niż zero lub jeśli wymagane są dni. Dni są pokazane, jeśli są większe niż zero.

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

Przykłady:

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 
 2
Author: Enigma Plus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-22 10:51:59

To działa idealnie:

$number = 13246;
echo sprintf( '%08d', $number );
 0
Author: CZ workman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-06 09:02:41
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
 -1
Author: Anand Kumar Prajapati,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-28 14:20:45