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?

Andromeda
sumber

Jawaban:

1213

Gunakan sprintf:

sprintf('%08d', 1234567);

Atau Anda juga dapat menggunakan str_pad:

str_pad($value, 8, '0', STR_PAD_LEFT);
reko_t
sumber
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

Kaze no Koe
sumber
32

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

$number = 1;
$number = str_pad($number, 2, '0', STR_PAD_LEFT);
Md. Shafiqur Rahman
sumber
27
echo str_pad("1234567", 8, '0', STR_PAD_LEFT);
joan16v
sumber
19

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

Ini akan menjadi:

$value = sprintf( '%08d', 1234567 );
Huppie
sumber
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);
?>

sumber
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);
Peter Lindqvist
sumber
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

AbcAeffchen
sumber
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 
Enigma Plus
sumber
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
Rutvik kakadiya
sumber
-1

Ini bekerja dengan sempurna:

$number = 13246;
echo sprintf( '%08d', $number );
Pekerja CZ
sumber
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.

jgmjgm
sumber
-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
Anand Kumar Prajapati
sumber