Formatowanie liczby z wiodącymi zerami w PHP [duplikat]

to pytanie ma już odpowiedzi tutaj : cyfry zerowe w łańcuchu (4 odpowiedzi) Zamknięte 8 miesiące temu .

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: ReinstateMonica3167040, 2009-11-09

12 answers

Użycie sprintf :

sprintf('%08d', 1234567);

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

str_pad($value, 8, '0', STR_PAD_LEFT);
 1282
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

 86
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

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

$number = 1;
$number = str_pad($number, 2, '0', STR_PAD_LEFT);
 43
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
echo str_pad("1234567", 8, '0', STR_PAD_LEFT);
 28
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 );
 19
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

sprintf tego potrzebujesz.

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

<?php
    $isodate = sprintf("%04d-%02d-%02d", $year, $month, $day);
?>
 16
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. Zrobiłem wszystkie testy z PHP 5.6.

Edit: mimo że wersja substr wydaje się być nadal bardzo szybka (PHP 7.2), jest również zepsuta w przypadku, gdy dane wejściowe mogą być dłuższe niż długość, na którą chcesz pad. Np. chcesz ustawić PADD do 3 cyfr, a twoje wejście ma 4 niż substr('0000' . '1234', -3) = '234' spowoduje tylko Ostatnie 3 cyfry

 8
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
2019-10-11 08:40:30
$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
 2
Author: Rutvik kakadiya,
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
2019-04-15 11:56:09

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

Zawsze można nadużywać typu żonglerka:

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

To nie będzie działać zgodnie z oczekiwaniami, jeśli 10 ** pad > INT_MAX lub value >= 10 * pad.

 -1
Author: jgmjgm,
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
2019-01-28 14:02:22