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.
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.
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.
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 czasowejSELECT
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ć
źródło
Kiedy potrzebuję 01 zamiast 1, działało dla mnie:
źródło
źródło
Chociaż nie jestem do końca pewien, co chcesz zrobić, prawdopodobnie szukasz sprintf .
To byłoby:
źródło
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”:
źródło
Prosta odpowiedź
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
Aby przyciąć ostatnie 8 cyfr
źródło
Jeśli liczby wejściowe mają zawsze 7 lub 8 cyfr, możesz także użyć
Przeprowadziłem kilka testów i okazało się, że będzie to nawet dwukrotnie szybsze niż
str_pad
lubsprintf
.Jeśli dane wejściowe mogą mieć dowolną długość, możesz również użyć
To nie jest tak szybkie jak inne, ale powinno być trochę szybsze niż
str_pad
isprintf
.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, cosubstr('0000' . '1234', -3) = '234'
spowoduje tylko 3 ostatnie cyfryźródło
$
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.
Przykłady:
źródło
źródło
Działa to doskonale:
źródło
Zawsze możesz nadużywać żonglerki typu:
To przyzwyczajenie praca zgodnie z oczekiwaniami, jeśli albo
10 ** pad > INT_MAX
albovalue >= 10 * pad
.źródło
źródło