Formatowanie liczby z wiodącymi zerami w PHP [duplikat]
Mam zmienną, która zawiera wartość 1234567
.
Chciałbym, aby zawierała dokładnie 8 cyfr, czyli 01234567
.
Czy istnieje do tego funkcja PHP?
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);
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
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);
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);
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 );
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);
?>
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);
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
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
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
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 );
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
.
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