number_format($number, $decimals) zwraca liczbę jako string z separatorem tysięcy i stałą liczbą miejsc po przecinku: number_format(1234567.891, 2) zwraca "1,234,567.89". Z jednym argumentem zaokrągla do liczby całkowitej: number_format(1234567.891) to "1,234,568".
Cztery parametry
number_format(
float $num,
int $decimals = 0,
?string $decimal_separator = ".",
?string $thousands_separator = ","
): string
Trzeci argument to znak między częścią całkowitą a dziesiętną, czwarty to znak między grupami trzech cyfr. Każdy może być dowolnym stringiem, także pustym albo znakiem wielobajtowym. Zmień separatory poniżej, aby zobaczyć każdy styl:
Dane locale (CLDR) używają dla francuskiego wąskiej twardej spacji (U+202F), a dla rosyjskiego twardej spacji (U+00A0), żeby liczba nigdy nie została rozbita na dwie linie. W HTML przekaż jako separator "\u{202F}" albo "\u{00A0}" zamiast zwykłej spacji.
Formatowanie liczby bez separatora tysięcy
Przekaż '' jako czwarty argument. Dostajesz zwykłą liczbę ze stałą liczbą miejsc po przecinku, czyli postać, której oczekują bramki płatności, eksporty CSV i wartości <input type="number">:
W ostatniej linii ważne jest round() przed rzutowaniem: 19.9 * 100 jest zapisane jako 1989.9999999999998, a samo (int) obcięłoby to do 1989.
Jak zaokrągla number_format
number_format() zaokrągla połówki od zera, tak jak round(), więc 0.5 staje się 1, a -2.5 staje się -3. Koryguje też drobny błąd binarny w wartościach takich jak 2.675, dlatego może się różnić od sprintf('%.2f'):
2.675 nie da się zapisać dokładnie w systemie binarnym; zapisana wartość jest odrobinę mniejsza. sprintf() formatuje tę zapisaną wartość i dostaje 2.67, a number_format() i round() traktują ją jak 2.675, które napisałeś. Jeśli potrzebujesz konkretnej zasady zaokrąglania, sam najpierw wywołaj round(), floor() albo ceil() (zobacz zaokrąglanie i matematyka) i przekaż wynik do number_format().
Formatowanie kwot i innych walut
number_format() nic nie wie o walutach, więc symbol dodajesz sam. Znak minus umieszczaj przed symbolem i pamiętaj, że jen nie ma części dziesiętnej:
Do wyjścia zależnego od locale, z właściwą pozycją symbolu dla każdego kraju, całą pracę wykonuje NumberFormatter z rozszerzenia intl:
$fmt = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
echo $fmt->formatCurrency(1234.5, 'EUR'); // 1.234,50 € (a no-break space before €)
Wymaga rozszerzenia intl, które nie wszędzie jest zainstalowane, więc przenośnym wyborem jest number_format() z własnym symbolem.
Wynik jest stringiem, a nie liczbą
To najczęstszy błąd z number_format(): sformatowanie wartości, a potem liczenie na niej. "1,234.50" nie jest stringiem liczbowym, więc PHP czyta tylko 1 przed przecinkiem:
<?php
echo number_format(1234.5, 2) + 1;
Warning: A non-numeric value encountered in /home/index.php on line 2
2
Przekazanie takiego stringa z powrotem do number_format() jest jeszcze gorsze: rzuca TypeError: number_format(): Argument #1 ($num) must be of type int|float, string given. Do obliczeń trzymaj surową liczbę, a formatuj dopiero w chwili wypisywania. Jeśli dostajesz sformatowany string z formularza lub pliku, najpierw usuń separatory:
Do dopełniania, wyrównania albo znaku plus przed liczbą użyj sprintf(); nie dodaje separatorów tysięcy, ale kontroluje szerokość i znak.
Najczęściej zadawane pytania
Jak sformatować liczbę z separatorem tysięcy w PHP?
Wywołaj number_format($n): number_format(1234567) zwraca "1,234,567". Podaj drugi argument dla miejsc po przecinku: number_format(1234567.891, 2) zwraca "1,234,567.89".
Jak użyć number_format bez przecinka?
Przekaż pusty string jako separator tysięcy: number_format(1234.5, 2, '.', '') zwraca "1234.50". Takiej postaci zwykle oczekują API płatności i pliki CSV.
Czy number_format zaokrągla, czy obcina?
Zaokrągla, połówki od zera: number_format(2.5) to "3", number_format(-2.5) to "-3", a number_format(2.675, 2) to "2.68". Aby zamiast tego obciąć miejsca po przecinku, najpierw użyj floor(): number_format(floor(2.679 * 100) / 100, 2) daje "2.67".
Jak formatować liczby po europejsku (1.234,56)?
Zamień separatory trzecim i czwartym argumentem: number_format(1234.56, 2, ',', '.') zwraca "1.234,56". Style francuski, polski i szwajcarski używają jako czwartego argumentu spacji albo apostrofu.
Dlaczego number_format daje zły wynik, gdy coś do niego dodaję?
number_format() zwraca string, na przykład "1,234.50", a PHP przy obliczeniach czyta z niego tylko 1 przed przecinkiem. Do obliczeń trzymaj liczbę, a number_format() wywołuj dopiero przy wypisywaniu.