PHP'de baştaki sıfırlarla bir sayıyı biçimlendirme


600

Değeri içeren bir değişken var 1234567.

Tam olarak 8 basamak içermesini istiyorum 01234567.

Bunun için bir PHP işlevi var mı?

Yanıtlar:


1212

Kullanım sprintf:

sprintf('%08d', 1234567);

Alternatif olarak şunları da kullanabilirsiniz str_pad:

str_pad($value, 8, '0', STR_PAD_LEFT);

54
Sadece eklemek istedim: str_pad negatif sayılarla bir seçenek değil
wtf8_decode

6
Sadece wtf8_decode söylediklerinin üstüne eklemek için; Negatif sayılar önde gelen sıfırlara sahip olmaz ve pozitif sayılar değildir. yani 08, tarih veya pozitif çift haneli bir sayı (Banka Hesabı sıralama kodu vb.) bekleyen bir şey olarak yazılır. Lütfen yanılıyorsam beni düzeltin, ama bildiğim kadarıyla, negatif bir değerin başında sıfır istemenin gerçek bir örneği yok mu?
guyver4mk

3
-12 ila 12 arasında olduğu sprintf('%+03d:00 UTC',$i)yerde $i, + veya - gerektiği gibi yazdıracağını ve ayrıca 2 basamaktan küçük sayılar için önde gelen sıfırları koyacağını eklemek istedim. SELECTHTML'de saat dilimi oluşturmak için harika .
Volomike

2
güncel sürümü (7.1) ve alt için sprintf( 3v4l.org/junvv/perf#output ) biraz daha hızlı olduğu str_pad( 3v4l.org/cliNP/perf#output )
Vladyslav Startsev

Negatif bir sayı ne zaman başa sıfır gerektirebilir ... Üç basamaklı bir kalkış sayacı? T-010, T-009, T-008 vb.
TRT 1968

83

Değerin $ değerinde olduğu düşünüldüğünde:

  • Yankılamak için:

    printf("%08d", $value);

  • Onu almak için:

    $formatted_value = sprintf("%08d", $value);

Hile yapmalı


32

1 yerine 01'e ihtiyacım olduğunda, aşağıdakiler benim için çalıştı:

$number = 1;
$number = str_pad($number, 2, '0', STR_PAD_LEFT);


19

Ne yapmak istediğinizden gerçekten emin olmasam da muhtemelen sprintf arıyorsunuz .

Bu olabilir:

$value = sprintf( '%08d', 1234567 );

16

sprintf ihtiyacınız olan şey bu.

EDIT (bir şekilde downvotes tarafından talep edildi ), yukarıda bağlantılı sayfadan, örnek olarak "sıfır dolgulu tamsayılar":

<?php
    $isodate = sprintf("%04d-%02d-%02d", $year, $month, $day);
?>

3
Sprintf () için man sayfasını bağlamanın ötesinde bir örnek veya daha fazla açıklama ile daha iyi olurdu.
jharrell

13

Basit cevap

$p = 1234567;
$p = sprintf("%08d",$p);

"Asla 8 basamaktan fazla olmayacak" diyen yorumu nasıl yorumlayacağından emin değilim ve girdiye veya çıktıya atıfta bulunuyorsa. Çıktıya başvuruyorsa, dizeyi kırpmak için ek bir substr () çağrısı yapmanız gerekir.

İlk 8 basamağı kırpmak için

$p = substr(sprintf('%08d', $p),0,8);

Son 8 haneyi kırpmak için

$p = substr(sprintf('%08d', $p),-8,8);

7

Giriş numaralarında her zaman 7 veya 8 basamak varsa,

$str = ($input < 10000000) ? 0 . $input : $input;

Bazı testler yaptım ve bunun str_padya da iki katı kadar hızlı olacağını anladım sprintf.
Girişin herhangi bir uzunluğu olabilirse,

$str = substr('00000000' . $input, -8);

Bu kadar hızlı Diğeri kadar değil, ama aynı zamanda biraz daha hızlı olmalı str_padve sprintf.

Btw: Testim ayrıca sprintfbunun biraz daha hızlı olduğunu söyledi str_pad. Tüm testleri PHP 5.6 ile yaptım.

Düzenleme: Taşıyamazsınız substrsürümü hala çok hızlı (PHP 7.2), aynı zamanda durumunda bozuldu gibi görünüyor girişinizi ne kadar uzun süre için ped istediğiniz uzunluğundan daha olabilir. Örneğin, 3 basamağa geçmek istiyorsunuz ve girişinizde substr('0000' . '1234', -3) = '234'yalnızca son 3 basamakla sonuçlanacak 4 sayı var


Teşekkürler, varyasyonunuzu beğendim ama $ str = (strlen ($ input) <8) olması gerektiğini düşünüyorum? 0. $ input: $ input;
JMX

@JMX Aslında, her iki yol da iyi çalışır. (Benim eksik yanı sıra $ben sadece sabit)
AbcAeffchen

1

Bu biçimi üretmek için bu basit işlevi yazdım: 01:00:03

Saniye her zaman gösterilir (sıfır olsa bile). Sıfırdan büyükse veya saat veya gün gerekirse dakika gösterilir. Sıfırdan büyükse veya gün gerekiyorsa saatler gösterilir. Sıfırdan büyükse günler gösterilir.

function formatSeconds($secs) {
    $result = '';

    $seconds = intval($secs) % 60;
    $minutes = (intval($secs) / 60) % 60;
    $hours = (intval($secs) / 3600) % 24;
    $days = intval(intval($secs) / (3600*24));

    if ($days > 0) {
        $result = str_pad($days, 2, '0', STR_PAD_LEFT) . ':';
    } 

    if(($hours > 0) || ($result!="")) {
        $result .= str_pad($hours, 2, '0', STR_PAD_LEFT) . ':';
    } 

    if (($minutes > 0) || ($result!="")) {
        $result .= str_pad($minutes, 2, '0', STR_PAD_LEFT) . ':';
    } 

    //seconds aways shown
    $result .= str_pad($seconds, 2, '0', STR_PAD_LEFT); 

    return $result;

} //funct

Örnekler:

echo formatSeconds(15); //15
echo formatSeconds(100); //01:40
echo formatSeconds(10800); //03:00:00 (mins shown even if zero)
echo formatSeconds(10000000); //115:17:46:40 

0
$no_of_digit = 10;
$number = 123;

$length = strlen((string)$number);
for($i = $length;$i<$no_of_digit;$i++)
{
    $number = '0'.$number;
}

echo $number; ///////  result 0000000123

-1

Mükemmel çalışıyor:

$number = 13246;
echo sprintf( '%08d', $number );

3
Bu sadece mevcut cevapların tekrarı gibi görünüyor.
Pang

-1

Her zaman hokkabazlık türünü kötüye kullanabilirsiniz:

function zpad(int $value, int $pad): string {
    return substr(1, $value + 10 ** $pad);
}

Bu ya beklendiği gibi çalışmaz ya 10 ** pad > INT_MAXda value >= 10 * pad.


-2
function duration($time){

    $hours = '';
    $minutes = '00:';
    $seconds = '00';

    if($time >= 3600){
        //0 - ~ hours
        $hours    = floor($time / 3600);
        $hours    = str_pad($hours, 2, '0', STR_PAD_LEFT) . ':';
        $time     = $time % 3600;
    }

    if($time >= 60){
        //0 - 60 minute     
        $minutes  = floor($time / 60);
        $minutes  = str_pad($minutes, 2, '0', STR_PAD_LEFT) . ':';
        $time     = $time % 60; 
    }

    if($time){
        //0 - 60 second
        $seconds  = str_pad($time, 2, '0', STR_PAD_LEFT);       
    }

    return $hours . $minutes . $seconds;

}

echo duration(59); // 00:59
echo duration(590); // 09:50
echo duration(5900); // 01:38:20
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.