Menu

PHP number_format(): separatore delle migliaia e decimali

number_format(1234567.891, 2) restituisce "1,234,567.89": arrotonda ai decimali indicati e aggiunge un separatore delle migliaia. Impara i quattro parametri, i formati europeo e giapponese, come arrotonda e perché il risultato è una stringa.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

number_format($number, $decimals) restituisce il numero come stringa con un separatore delle migliaia e un numero fisso di decimali: number_format(1234567.891, 2) restituisce "1,234,567.89". Con un solo argomento arrotonda a un numero intero: number_format(1234567.891) vale "1,234,568".

I quattro parametri

number_format(
    float $num,
    int $decimals = 0,
    ?string $decimal_separator = ".",
    ?string $thousands_separator = ","
): string

Il terzo argomento è il carattere tra la parte intera e i decimali, il quarto il carattere tra i gruppi di tre cifre. Entrambi possono essere qualsiasi stringa, anche vuota o un carattere multibyte. Modifica i separatori qui sotto per vedere ogni stile:

I dati di localizzazione (CLDR) usano uno spazio stretto non separabile (U+202F) per il francese e uno spazio non separabile (U+00A0) per il russo, così un numero non va mai a capo su due righe. In HTML, passa "\u{202F}" o "\u{00A0}" come separatore invece di un semplice spazio.

Formattare un numero senza separatore delle migliaia

Passa '' come quarto argomento. Ottieni un numero semplice con un numero fisso di decimali, la forma che si aspettano i gateway di pagamento, le esportazioni CSV e i valori di <input type="number">:

Nell'ultima riga, round() prima del cast conta: 19.9 * 100 viene memorizzato come 1989.9999999999998, e (int) da solo lo taglierebbe a 1989.

Come arrotonda number_format

number_format() arrotonda la metà lontano dallo zero, come fa round(), quindi 0.5 diventa 1 e -2.5 diventa -3. Corregge anche il minuscolo errore binario di valori come 2.675, ed è per questo che può non essere d'accordo con sprintf('%.2f'):

2.675 non si può memorizzare esattamente in binario; il valore memorizzato è appena sotto. sprintf() formatta quel valore memorizzato e ottiene 2.67, mentre number_format() e round() lo trattano come il 2.675 che hai scritto. Se ti serve una regola di arrotondamento precisa, chiama prima tu round(), floor() o ceil() (vedi arrotondamenti e matematica) e passa il risultato a number_format().

Formattare denaro e altre valute

number_format() non sa nulla delle valute, quindi il simbolo lo aggiungi tu. Metti il segno negativo prima del simbolo, e ricorda che lo yen non ha decimali:

Per un output che segue il locale, con la posizione giusta del simbolo per ogni paese, il NumberFormatter dell'estensione intl fa tutto il lavoro:

$fmt = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
echo $fmt->formatCurrency(1234.5, 'EUR'); // 1.234,50 € (a no-break space before €)

Richiede l'estensione intl, che non è installata ovunque, quindi number_format() con il tuo simbolo è la scelta portabile.

Il risultato è una stringa, non un numero

È il bug più comune con number_format(): formattare un valore e poi farci dei calcoli. "1,234.50" non è una stringa numerica, quindi PHP legge solo l'1 prima della virgola:

<?php
echo number_format(1234.5, 2) + 1;
Warning: A non-numeric value encountered in /home/index.php on line 2
2

Passare una stringa del genere di nuovo a number_format() è peggio: lancia TypeError: number_format(): Argument #1 ($num) must be of type int|float, string given. Tieni il numero grezzo per i calcoli e formatta solo nel momento in cui stampi. Se ricevi una stringa già formattata da un form o da un file, togli prima i separatori:

Per il riempimento, l'allineamento o un segno più davanti al numero, usa invece sprintf(); non aggiunge i separatori delle migliaia, ma controlla larghezza e segno.

Domande frequenti

Come formatto un numero con il separatore delle migliaia in PHP?

Chiama number_format($n): number_format(1234567) restituisce "1,234,567". Passa un secondo argomento per i decimali: number_format(1234567.891, 2) restituisce "1,234,567.89".

Come uso number_format senza virgola?

Passa una stringa vuota come separatore delle migliaia: number_format(1234.5, 2, '.', '') restituisce "1234.50". È la forma che di solito si aspettano le API di pagamento e i file CSV.

number_format arrotonda o tronca?

Arrotonda, con la metà lontano dallo zero: number_format(2.5) vale "3", number_format(-2.5) vale "-3" e number_format(2.675, 2) vale "2.68". Per tagliare invece i decimali, usa prima floor(): number_format(floor(2.679 * 100) / 100, 2) dà "2.67".

Come formatto i numeri all'europea (1.234,56)?

Scambia i separatori con il terzo e il quarto argomento: number_format(1234.56, 2, ',', '.') restituisce "1.234,56". Gli stili francese e svizzero usano uno spazio o un apostrofo come quarto argomento.

Perché number_format dà un risultato sbagliato quando ci sommo qualcosa?

number_format() restituisce una stringa come "1,234.50", e PHP legge solo l'1 prima della virgola quando ci fai dei calcoli. Tieni il numero per i calcoli e chiama number_format() solo quando lo stampi.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA