Come funziona .sprintf ("% 4.2f", value) in PHP?

Sto lavorando ad altri tutorial PHP, in particolare DevZone PHP 101 , e sono confuso da:

echo .sprintf("%4.2f", (2 * $radius * pi())) 

ho trovato questo

Penso che questo significhi produrre un field a virgola mobile di quattro posizioni di width con due cifre decimali, usando il valore del primo parametro successivo.

Questo deriva dalla linea C / C ++ dei linguaggi di programmazione. uno sprintf () prende il primo parametro come istruzione di formato. Tutto ciò che inizia con una% è un identificatore di field; qualsiasi altra cosa è solo un text printingbile. Quindi, se si fornisce una dichiarazione di formato con tutto il text e nessun identificatore, verrà printingto esattamente nel modo in cui appare. Con gli specificatori di formato, ha bisogno di dati su cui lavorare.

Ma dopo aver provato alcuni valori diversi non riesco ancora a ottenerlo. Mi sembra che lo scopo di questo caso sia solo quello di limitare il numero decimale a 2 posizioni

 .sprintf("%.2f", (2 * $radius * pi())) 

Qual è il punto dei 4 in primo piano? Nel manuale PHP mi port a credere che determini il numero totale di caratteri dovrebbe essere 4 ma (a) questo non è il caso dal momento che il punto decimale lo rende 5 caratteri e (b) questo non è il caso perché ho provato a cambiarlo in un un numero più grande come% 8.2f e non ha virato alcun zero su nessuna delle due estremità. Qualcuno potrebbe spiegarlo meglio?

Grazie!

Il primo numero% 8 .2f nell'identificatore di formato è per la lunghezza di riempimento. Per default sprintf usa il carattere dello spazio.

Puoi vedere l'effetto con numbers più grandi:

 printf("%20.2f", 1.23); 

Per esempio porterà a:

  1.23 

Ci sono 16 spazi prima del numero. Il float occupa 4 e la lunghezza di riempimento è impostata su 20, ad esempio. (Forse lo hai printingto nella pagina web, quindi non sono stati visibili spazi di riempimento ..)

E c'è un esempio più avanti nella manpage di sprintf per usare caratteri di riempimento alternativi:

 printf("%'*20.2f", 1.23); // use the custom padding character '*' 

Risulterà in:

 ****************1.23