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