Odpowiedzi:
Użyj sprintf
:
sprintf('%08d', 1234567);
Alternatywnie możesz również użyć str_pad
:
str_pad($value, 8, '0', STR_PAD_LEFT);
sprintf('%+03d:00 UTC',$i)
gdzie $i
jest 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 SELECT
w HTML.
sprintf
( 3v4l.org/junvv/perf#output ) jest nieco szybszy niż str_pad
( 3v4l.org/cliNP/perf#output )
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ć
Kiedy potrzebuję 01 zamiast 1, działało dla mnie:
$number = 1;
$number = str_pad($number, 2, '0', STR_PAD_LEFT);
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);
?>
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);
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_pad
lub 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_pad
i sprintf
.
Btw: Mój test również powiedział, że sprintf
jest trochę szybszy niż str_pad
. Wszystkie testy wykonałem przy pomocy PHP 5.6.
Edycja: Chociaż substr
wersja 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
$
właśnie naprawiłem)
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
$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
Działa to doskonale:
$number = 13246;
echo sprintf( '%08d', $number );
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