2015-02-26 13 views
12

Belirli bir kesinlik ile bazı kayan nokta sayılarının biçimlendirilmiş bir dizesini almak için sprintf() kullanıyorum. Ayrıca, tüm sayıları eşit uzunlukta yapmak için baştaki sıfırları eklemek istedim. tamsayılar için yapmak pretty straight forward geçerli: Bu 01 sonuçlanacaktırPHP: Sprintf() ile süzülmek için lider sıfırlar/sıfır doldurma nasıl eklenir?

sprintf('%02d', 1); 

. Ancak, hassas bir şamandıra için aynı çalışırken çalışmaz:

sprintf('%02.2f', 1); 

1.00 verir.

Önde gelen sıfırları bir float değerine nasıl ekleyebilirim?

cevap

17

Kısa cevap: %02%05 yerini nasılsprintf('%05.2f', 1); istenen bir sonuç 01.00

Not verecektir. Açıklama

Bu forum post

bana doğru yönde işaret etti: İlk sayı ne gelen sıfırların sayısını ne de ondalık Seperatör solunda toplam charaters sayısını ancak toplam sayısını arasında ifade etmez sonuçtaki dizede karakterler!

Örnek az

sprintf('%02.2f', 1); verimler hassas ondalık seperatör "." artı en az 2 karakter. Toplamda 3 karakter olduğundan, başlangıçtaki %02'un bir etkisi yoktur. o sprintf('%05.2f', 1);

Bazı kod verme, tek hassas ve ondalık seperatör için 3 karakterler eklemek gerekiyor istenen "2 baştaki sıfırları" almak için

$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"; 
} 

Çıktı

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