2015-02-26 20 views
12

Sto usando sprintf() per ottenere una stringa formattata di alcuni numeri float con una certa precisione. Inoltre, volevo aggiungere degli zeri iniziali per rendere tutti i numeri anche di lunghezza. Fare questo per gli interi è pretty straight forward:PHP: Come aggiungere zeri iniziali/zero padding a float tramite sprintf()?

sprintf('%02d', 1); 

Questo si tradurrà in 01. Tuttavia, cercando la stessa cosa per un galleggiante con precisione non funziona:

sprintf('%02.2f', 1); 

rendimenti 1.00.

Come posso aggiungere zeri iniziali a un valore float?

risposta

17

Risposta breve:sprintf('%05.2f', 1); darà il risultato desiderato 01.00

Si noti come %02 è stato sostituito da %05.

Spiegazione

Questo forum post mi ha segnalato nella giusta direzione: Il primo numero non ne indicano il numero di zeri, né il numero di charaters totale alla sinistra del separatore decimale ma il numero totale di personaggi nella stringa risultante!

Esempio

sprintf('%02.2f', 1); rendimenti almeno il separatore decimale "." ed almeno 2 caratteri per la precisione. Dal momento che questo è già 3 caratteri in totale, lo %02 all'inizio non ha alcun effetto. Per ottenere il desiderato "2 zeri iniziali" si ha la necessità di aggiungere i 3 caratteri per la precisione e separatore decimale, il che rende sprintf('%05.2f', 1);

Alcuni codice

$num = 42.0815; 

function printFloatWithLeadingZeros($num, $precision = 2, $leadingZeros = 0){ 
    $decimalSeperator = "."; 
    $adjustedLeadingZeros = $leadingZeros + mb_strlen($decimalSeperator) + $precision; 
    $pattern = "%0{$adjustedLeadingZeros}{$decimalSeperator}{$precision}f"; 
    return sprintf($pattern,$num); 
} 

for($i = 0; $i <= 6; $i++){ 
    echo "$i max. leading zeros on $num = ".printFloatWithLeadingZeros($num,2,$i)."\n"; 
} 

uscita

0 max. leading zeros on 42.0815 = 42.08 
1 max. leading zeros on 42.0815 = 42.08 
2 max. leading zeros on 42.0815 = 42.08 
3 max. leading zeros on 42.0815 = 042.08 
4 max. leading zeros on 42.0815 = 0042.08 
5 max. leading zeros on 42.0815 = 00042.08 
6 max. leading zeros on 42.0815 = 000042.08 
Problemi correlati