Menu

number_format() w PHP: separator tysięcy i ułamki

number_format(1234567.891, 2) zwraca "1,234,567.89": zaokrągla do podanej liczby miejsc po przecinku i dodaje separator tysięcy. Poznaj cztery parametry, formaty europejskie, polski i japoński, sposób zaokrąglania i powód, dla którego wynik jest stringiem.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

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.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ