Formatowanie liczby z wiodącymi zerami w PHP


600

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

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

Czy jest do tego funkcja PHP?

Odpowiedzi:


1212

Użyj sprintf:

sprintf('%08d', 1234567);

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

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

54
Chciałem tylko dodać: str_pad nie jest opcją z liczbami ujemnymi
wtf8_decode

6
Po prostu dodajmy do tego, co powiedział wtf8_decode; Liczby ujemne nie miałyby zer wiodących i nie są liczbami dodatnimi. tzn. 08 zostanie zapisane jako data lub coś, co oczekuje dodatniej dwucyfrowej liczby (kod sortowania konta bankowego itp.). Proszę mnie poprawić, jeśli się mylę, ale o ile wiem, nie ma rzeczywistego przypadku wymagającego wiodącego zera na wartości ujemnej?
guyver4mk

3
Chciałem dodać, że sprintf('%+03d:00 UTC',$i)gdzie $ijest od -12 do 12, w razie potrzeby wydrukuje + lub -, a także wstawi początkowe zera dla liczb mniejszych niż 2 cyfry. Idealne do tworzenia strefy czasowej SELECTw HTML.
Volomike,

2
dla aktualnej wersji (7.1) i niższej sprintf( 3v4l.org/junvv/perf#output ) jest nieco szybszy niż str_pad( 3v4l.org/cliNP/perf#output )
Vladyslav Startsev

Kiedy liczba ujemna może wymagać początkowego zera ... Licznik startowy z trzema cyframi? T-010, T-009, T-008 itd.
TRT 1968

83

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

  • Aby to powtórzyć:

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

  • Dostać to:

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

To powinno wystarczyć


32

Kiedy potrzebuję 01 zamiast 1, działało dla mnie:

$number = 1;
$number = str_pad($number, 2, '0', STR_PAD_LEFT);


19

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

To byłoby:

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

16

sprintf jest to, czego potrzebujesz.

EDYCJA ( jakoś zażądana przez downvotes ), ze strony, do której prowadzi link, oto przykładowe „liczby całkowite zerowane”:

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

3
Byłoby lepiej z przykładem lub więcej wyjaśnień poza zwykłym łączeniem strony podręcznika dla sprintf ().
jharrell

13

Prosta odpowiedź

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

Nie jestem pewien, jak zinterpretować komentarz „Nigdy nie będzie więcej niż 8 cyfr” i czy odnosi się do wejścia lub wyjścia. Jeśli odnosi się do wyniku, musiałbyś mieć dodatkowe wywołanie substr (), aby wyciąć ciąg.

Aby wyciąć pierwsze 8 cyfr

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

Aby przyciąć ostatnie 8 cyfr

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

7

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

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

Przeprowadziłem kilka testów i okazało się, że będzie to nawet dwukrotnie szybsze niż str_padlub sprintf.
Jeśli dane wejściowe mogą mieć dowolną długość, możesz również użyć

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

To nie jest tak szybkie jak inne, ale powinno być trochę szybsze niż str_padi sprintf.

Btw: Mój test również powiedział, że sprintfjest trochę szybszy niż str_pad. Wszystkie testy wykonałem przy pomocy PHP 5.6.

Edycja: Chociaż substrwersja wydaje się być wciąż bardzo szybka (PHP 7.2), jest również zepsuta w przypadku, gdy twój wkład może być dłuższy niż długość, którą chcesz wypełnić. Np. Chcesz wstawić 3 cyfry, a twoje dane wejściowe mają 4, co substr('0000' . '1234', -3) = '234'spowoduje tylko 3 ostatnie cyfry


Dzięki, podoba mi się twoja odmiana, ale myślę, że powinna ona wynosić $ str = (strlen ($ input) <8)? 0. $ input: $ input;
JMX

@JMX W rzeczywistości oba sposoby działają dobrze. (Oprócz mojej zaginionej $właśnie naprawiłem)
AbcAeffchen

1

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

Sekundy są zawsze wyświetlane (nawet jeśli zero). Minuty są wyświetlane, jeśli są większe od zera lub jeśli wymagane są godziny lub dni. Godziny są wyświetlane, jeśli są większe od zera lub jeśli wymagane są dni. Wyświetlane są dni, jeśli są większe od zera.

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 

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

Działa to doskonale:

$number = 13246;
echo sprintf( '%08d', $number );

3
To wydaje się być powtórzeniem istniejących odpowiedzi.
Pang

-1

Zawsze możesz nadużywać żonglerki typu:

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

To przyzwyczajenie praca zgodnie z oczekiwaniami, jeśli albo 10 ** pad > INT_MAXalbo 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.