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?

Andromeda
źródło

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);
reko_t
źródło
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ć

Kaze no Koe
źródło
32

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

$number = 1;
$number = str_pad($number, 2, '0', STR_PAD_LEFT);
Md. Shafiqur Rahman
źródło
27
echo str_pad("1234567", 8, '0', STR_PAD_LEFT);
joan16v
źródło
19

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

To byłoby:

$value = sprintf( '%08d', 1234567 );
Huppie
źródło
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);
?>

źródło
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);
Peter Lindqvist
źródło
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

AbcAeffchen
źródło
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 
Enigma Plus
źródło
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
Rutvik kakadiya
źródło
-1

Działa to doskonale:

$number = 13246;
echo sprintf( '%08d', $number );
Robotnik CZ
źródło
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.

jgmjgm
źródło
-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
Anand Kumar Prajapati
źródło