Menu

PHP sprintf(): formattare stringhe, padding e decimali

sprintf() costruisce una stringa da un formato e dei valori: sprintf('%05.2f', 3.14159) restituisce "03.14". Impara %s, %d e %f, il riempimento con zeri, i decimali fissi, l'allineamento, la numerazione degli argomenti, printf e vsprintf.

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

sprintf() restituisce una stringa costruita da un formato e da una lista di valori: ogni segnaposto % nel formato viene sostituito dal valore successivo. sprintf('%s is %d years old', 'Ada', 36) restituisce "Ada is 36 years old". printf() accetta gli stessi argomenti ma stampa il risultato invece di restituirlo.

I segnaposto vengono riempiti in ordine, da sinistra a destra. %.2f mostra sempre due decimali (4.50, non 4.5), e %05d riempie il numero con zeri fino a cinque cifre.

Gli specificatori di formato

Un segnaposto è %, eventuali modificatori, poi una lettera per il tipo:

SpecificatoreSignificatosprintf(...)Risultato
%sstringasprintf('%s', 'PHP')PHP
%dintero (con segno)sprintf('%d', 42.9)42
%ffloat, 6 decimali di defaultsprintf('%f', 1.5)1.500000
%.2ffloat, 2 decimalisprintf('%.2f', 1.5)1.50
%enotazione scientificasprintf('%e', 1234.5678)1.234568e+3
%x / %Xesadecimalesprintf('%x', 255)ff
%oottalesprintf('%o', 8)10
%bbinariosprintf('%b', 5)101
%ccarattere da un codicesprintf('%c', 65)A
%uintero senza segnosprintf('%u', 3)3
%%un segno di percentuale letteralesprintf('%d%%', 50)50%

Cambia i valori qui sotto ed eseguilo di nuovo:

%d tronca un float verso lo zero, quindi 42.9 diventa 42. Se vuoi 43, arrotonda prima: sprintf('%d', round(42.9)). Una stringa che non è un numero, come 'abc', con %d diventa 0.

Riempire con zeri iniziali

Tra % e la lettera puoi mettere un carattere di riempimento e una larghezza. %05d significa "riempi con 0 fino a una larghezza di 5". È il modo consueto di formattare numeri d'ordine, ID di fattura, orari e date.

La larghezza è un minimo. Un numero più lungo della larghezza viene stampato per intero.

%05.2f: larghezza e decimali insieme

Con i float, la larghezza conta ogni carattere del risultato, compresi il punto decimale e il segno meno. Ecco perché %05.2f su 3.14159 dà 03.14: cinque caratteri in totale, due dei quali dopo il punto.

%f usa il separatore decimale del locale corrente (impostato con setlocale()), mentre %F usa sempre un punto. Se il tuo codice imposta un locale e ti serve un punto per JSON, CSV o un'API, usa %F.

Allineare il testo in colonne

Una larghezza positiva allinea a destra, un - prima della larghezza allinea a sinistra, e ' seguito da un carattere imposta un carattere di riempimento personalizzato. Insieme, allineano report e scontrini in testo semplice.

%-14s riempie a destra il nome dell'articolo fino a 14 caratteri, %8.2f allinea a destra il prezzo in 8 caratteri, e %'-27s con una stringa vuota stampa una riga di 27 trattini. %'*10s riempie con * invece che con spazi.

Numerare gli argomenti per riusarli o riordinarli

%1$s significa "il primo argomento come stringa", %2$d "il secondo come intero". I segnaposto numerati ti permettono di usare un valore due volte o cambiare l'ordine senza cambiare la lista degli argomenti, cosa che serve ai traduttori quando l'ordine delle parole cambia tra le lingue.

vsprintf, printf e i valori restituiti

vsprintf() accetta i valori come un unico array, comodo quando si trovano già in un array. printf() restituisce il numero di byte stampati, e vprintf() è la versione di printf() con un array.

Il conteggio di printf() include l'a capo, quindi "Hello\n" vale 6 byte. Per il testo multibyte conta i byte, non i caratteri.

Troppi pochi argomenti generano un errore

Da PHP 8, un formato con più segnaposto che valori lancia un ArgumentCountError invece di restituire false. Conta i segnaposto % (ignorando %%) quando vedi questo errore.

Il messaggio conta la stringa di formato come argomento: ArgumentCountError: 4 arguments are required, 3 given. Gli argomenti in più vengono ignorati in silenzio, quindi l'errore opposto non compare come errore. Se il risultato di sprintf sembra sbagliato, stampa il formato accanto ai valori. Quando ti serve solo un separatore delle migliaia, number_format() è più semplice che costruirne uno con sprintf. L'elenco completo dei modificatori è su php.net.

Domande frequenti

Come aggiungo zeri iniziali a un numero in PHP?

Usa sprintf('%05d', 42), che restituisce "00042". Lo 0 è il carattere di riempimento e 5 è la larghezza totale. Per una stringa, str_pad('42', 5, '0', STR_PAD_LEFT) dà lo stesso risultato.

Come formatto un numero con 2 decimali con sprintf?

Usa %.2f: sprintf('%.2f', 3.14159) restituisce "3.14" e sprintf('%.2f', 5) restituisce "5.00". Aggiungi una larghezza per riempire anche a sinistra: %08.2f dà "00003.14".

Qual è la differenza tra printf e sprintf in PHP?

sprintf() restituisce la stringa formattata così puoi salvarla. printf() la stampa subito e restituisce il numero di byte stampati. echo sprintf(...) e printf(...) producono lo stesso output.

Cosa significa %s in PHP?

%s è un segnaposto per una stringa in sprintf() e printf(): sprintf('Hello, %s', 'Ada') restituisce "Hello, Ada". I numeri passati a %s vengono convertiti in stringhe. %d è per gli interi e %f per i float.

Come uso lo stesso argomento due volte in sprintf?

Numera i segnaposto: sprintf('%1$s loves %2$s, and %2$s loves %1$s', 'Ada', 'PHP'). Usa gli apici singoli intorno al formato: tra virgolette doppie PHP legge $s come una variabile, quindi "%1$s" diventa %1 seguito dal valore di $s.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA