sprintf() zwraca string zbudowany z formatu i listy wartości: każde miejsce % w formacie zostaje zastąpione kolejną wartością. sprintf('%s is %d years old', 'Ada', 36) zwraca "Ada is 36 years old". printf() przyjmuje te same argumenty, ale wypisuje wynik zamiast go zwracać.
Miejsca są wypełniane po kolei, od lewej do prawej. %.2f zawsze pokazuje dwa miejsca po przecinku (4.50, a nie 4.5), a %05d dopełnia liczbę zerami do pięciu cyfr.
Specyfikatory formatu
Miejsce to %, opcjonalne modyfikatory, a potem jedna litera oznaczająca typ:
| Specyfikator | Znaczenie | sprintf(...) | Wynik |
|---|---|---|---|
%s | string | sprintf('%s', 'PHP') | PHP |
%d | liczba całkowita (ze znakiem) | sprintf('%d', 42.9) | 42 |
%f | liczba zmiennoprzecinkowa, domyślnie 6 miejsc | sprintf('%f', 1.5) | 1.500000 |
%.2f | liczba zmiennoprzecinkowa, 2 miejsca | sprintf('%.2f', 1.5) | 1.50 |
%e | notacja naukowa | sprintf('%e', 1234.5678) | 1.234568e+3 |
%x / %X | szesnastkowo | sprintf('%x', 255) | ff |
%o | ósemkowo | sprintf('%o', 8) | 10 |
%b | dwójkowo | sprintf('%b', 5) | 101 |
%c | znak z kodu | sprintf('%c', 65) | A |
%u | liczba całkowita bez znaku | sprintf('%u', 3) | 3 |
%% | dosłowny znak procentu | sprintf('%d%%', 50) | 50% |
Zmień wartości poniżej i uruchom ponownie:
%d obcina liczbę zmiennoprzecinkową w stronę zera, więc 42.9 staje się 42. Jeśli chcesz 43, najpierw zaokrąglij: sprintf('%d', round(42.9)). String, który nie jest liczbą, na przykład 'abc', przy %d staje się 0.
Dopełnianie zerami wiodącymi
Między % a literą możesz umieścić znak dopełnienia i szerokość. %05d oznacza „dopełnij znakiem 0 do szerokości 5”. To zwykły sposób formatowania numerów zamówień, identyfikatorów faktur, godzin i dat.
Szerokość jest minimum. Liczba dłuższa niż szerokość zostaje wypisana w całości.
%05.2f: szerokość i miejsca po przecinku razem
Przy liczbach zmiennoprzecinkowych szerokość liczy każdy znak wyniku, w tym kropkę dziesiętną i znak minus. Dlatego %05.2f dla 3.14159 daje 03.14: łącznie pięć znaków, z czego dwa po kropce.
%f używa separatora dziesiętnego z bieżącego locale (ustawianego przez setlocale()), a %F zawsze używa kropki. Jeśli twój kod ustawia locale (na przykład polskie, z przecinkiem), a potrzebujesz kropki dla JSON, CSV lub API, użyj %F.
Wyrównanie tekstu w kolumnach
Dodatnia szerokość wyrównuje do prawej, - przed szerokością wyrównuje do lewej, a ' z następującym po nim znakiem ustawia własny znak dopełnienia. Razem pozwalają ułożyć raporty tekstowe i paragony.
%-14s dopełnia nazwę pozycji z prawej do 14 znaków, %8.2f wyrównuje cenę do prawej w 8 znakach, a %'-27s z pustym stringiem wypisuje linię 27 myślników. %'*10s dopełnia znakiem * zamiast spacji.
Numerowanie argumentów do ponownego użycia lub zmiany kolejności
%1$s oznacza „pierwszy argument jako string”, a %2$d „drugi jako liczba całkowita”. Numerowane miejsca pozwalają użyć wartości dwa razy albo zmienić kolejność bez zmiany listy argumentów, czego potrzebują tłumacze, gdy szyk zdania różni się między językami.
vsprintf, printf i wartości zwracane
vsprintf() przyjmuje wartości jako jedną tablicę, co przydaje się, gdy już są w tablicy. printf() zwraca liczbę wypisanych bajtów, a vprintf() to tablicowa wersja printf().
Liczba z printf() obejmuje znak nowej linii, więc "Hello\n" to 6 bajtów. Dla tekstu wielobajtowego liczy bajty, a nie znaki.
Za mało argumentów rzuca błąd
Od PHP 8 format z większą liczbą miejsc niż wartości rzuca ArgumentCountError zamiast zwracać false. Gdy zobaczysz ten błąd, policz miejsca % (pomijając %%).
Komunikat liczy string formatu jako argument: ArgumentCountError: 4 arguments are required, 3 given. Nadmiarowe argumenty są po cichu ignorowane, więc odwrotny błąd nie pojawia się jako błąd. Jeśli wynik sprintf wygląda źle, wypisz format obok wartości. Gdy potrzebujesz tylko separatora tysięcy, number_format() jest prostsze niż budowanie go przez sprintf. Pełną listę modyfikatorów znajdziesz na php.net.
Najczęściej zadawane pytania
Jak dodać zera wiodące do liczby w PHP?
Użyj sprintf('%05d', 42), które zwraca "00042". 0 to znak dopełnienia, a 5 to całkowita szerokość. Dla stringa str_pad('42', 5, '0', STR_PAD_LEFT) daje ten sam wynik.
Jak sformatować liczbę do 2 miejsc po przecinku przez sprintf?
Użyj %.2f: sprintf('%.2f', 3.14159) zwraca "3.14", a sprintf('%.2f', 5) zwraca "5.00". Dodaj szerokość, aby też dopełnić: %08.2f daje "00003.14".
Czym różni się printf od sprintf w PHP?
sprintf() zwraca sformatowany string, który możesz zapisać. printf() od razu go wypisuje i zwraca liczbę wypisanych bajtów. echo sprintf(...) i printf(...) dają ten sam wynik na wyjściu.
Co oznacza %s w PHP?
%s to miejsce na string w sprintf() i printf(): sprintf('Hello, %s', 'Ada') zwraca "Hello, Ada". Liczby przekazane do %s są zamieniane na stringi. %d służy do liczb całkowitych, a %f do zmiennoprzecinkowych.
Jak użyć tego samego argumentu dwa razy w sprintf?
Ponumeruj miejsca: sprintf('%1$s loves %2$s, and %2$s loves %1$s', 'Ada', 'PHP'). Format otocz pojedynczymi cudzysłowami: w podwójnych PHP czyta $s jako zmienną, więc "%1$s" staje się %1 i wartością $s.