Memformat angka dengan angka nol di depan dalam PHP


601

Saya memiliki variabel yang berisi nilai 1234567.

Saya ingin mengandung tepat 8 digit, yaitu 01234567.

Apakah ada fungsi PHP untuk itu?

Jawaban:


1213

Gunakan sprintf:

sprintf('%08d', 1234567);

Atau Anda juga dapat menggunakan str_pad:

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

54
Hanya ingin menambahkan: str_pad bukan opsi dengan angka negatif
wtf8_decode

6
Hanya menambahkan di atas apa yang dikatakan wtf8_decode; Angka negatif tidak akan memiliki nol di depan, dan itu bukan angka positif. yaitu 08 akan ditulis seperti tanggal, atau sesuatu yang mengharapkan angka dua digit positif (kode sortir Rekening Bank, dll). Tolong perbaiki saya jika saya salah, tetapi sejauh yang saya tahu, tidak ada contoh kehidupan nyata yang membutuhkan nol di depan pada nilai negatif?
guyver4mk

3
Ingin menambahkan bahwa di sprintf('%+03d:00 UTC',$i)mana $i-12 hingga 12, akan mencetak + atau - sesuai kebutuhan, dan juga akan menempatkan angka nol di depan untuk angka kurang dari 2 digit. Sangat bagus untuk membuat zona waktu SELECTdalam HTML.
Volomike

2
untuk versi saat ini (7.1) dan lebih rendah sprintf( 3v4l.org/junvv/perf#output ) sedikit lebih cepat daripada str_pad( 3v4l.org/cliNP/perf#output )
Vladyslav Startsev

Kapan mungkin angka negatif memerlukan nol di depan ... Penghitung lift dengan tiga digit? T-010, T-009, T-008 dll.
TRT 1968

83

Mengingat bahwa nilainya dalam $ value:

  • Untuk menggemakannya:

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

  • Untuk mendapatkan:

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

Itu harus melakukan trik


32

Ketika saya membutuhkan 01 bukannya 1, yang berikut ini berfungsi untuk saya:

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


19

Meskipun saya tidak begitu yakin apa yang ingin Anda lakukan, Anda mungkin mencari sprintf .

Ini akan menjadi:

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

16

sprintf adalah apa yang kamu butuhkan.

EDIT ( entah bagaimana diminta oleh downvotes ), dari halaman yang ditautkan di atas, inilah contoh "bilangan bulat tanpa bantalan":

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

3
Akan lebih baik dengan contoh atau lebih banyak penjelasan di luar hanya menghubungkan halaman manual untuk sprintf ().
jharrell

13

Jawaban sederhana

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

Saya tidak yakin bagaimana menafsirkan komentar yang mengatakan "Itu tidak akan pernah lebih dari 8 digit" dan jika itu mengacu pada input atau output. Jika mengacu pada output, Anda harus memiliki panggilan substr () tambahan untuk klip string.

Untuk memotong 8 digit pertama

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

Untuk memotong 8 digit terakhir

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

7

Jika nomor input selalu 7 atau 8 digit, Anda juga dapat menggunakan

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

Saya menjalankan beberapa tes dan mendapatkan bahwa ini akan menjadi dua kali lipat secepat str_padatau sprintf.
Jika input bisa memiliki panjang, maka Anda juga bisa menggunakan

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

Ini tidak secepat yang lain, tetapi juga harus sedikit lebih cepat daripada str_paddan sprintf.

Btw: Tes saya juga mengatakan itu sprintfsedikit lebih cepat daripada str_pad. Saya membuat semua tes dengan PHP 5.6.

Sunting: Walaupun substrversinya tampaknya masih sangat cepat (PHP 7.2), versi ini juga rusak jika input Anda bisa lebih panjang dari panjang yang ingin Anda pad. Misalnya Anda ingin substr('0000' . '1234', -3) = '234'menambahkan 3 digit dan input Anda memiliki 4 daripada hanya akan menghasilkan 3 digit terakhir


Terima kasih, saya suka variasi Anda, tetapi saya pikir itu harus $ str = (strlen ($ input) <8)? 0. $ input: $ input;
JMX

@JMX Sebenarnya, kedua cara bekerja dengan baik. (Di samping kehilangan saya, $saya baru saja memperbaiki)
AbcAeffchen

1

Saya menulis fungsi sederhana ini untuk menghasilkan format ini: 01:00:03

Detik selalu ditampilkan (bahkan jika nol). Menit ditampilkan jika lebih besar dari nol atau jika diperlukan jam atau hari. Jam ditampilkan jika lebih besar dari nol atau jika hari diperlukan. Hari ditampilkan jika lebih besar dari nol.

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

Contoh:

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

Ini bekerja dengan sempurna:

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

3
Ini sepertinya hanya pengulangan dari jawaban yang ada.
Pang

-1

Anda selalu dapat menyalahgunakan jenis juggling:

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

Ini tidak akan berfungsi seperti yang diharapkan jika salah satu 10 ** pad > INT_MAXatau 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.