Menu

PHP sprintf(): Format String, Padding, dan Angka Desimal

sprintf() menyusun string dari sebuah format dan nilai-nilai: sprintf('%05.2f', 3.14159) mengembalikan "03.14". Pelajari %s, %d, dan %f, padding nol, jumlah desimal tetap, perataan teks, penomoran argumen, printf, dan vsprintf.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

sprintf() mengembalikan string yang disusun dari sebuah format dan daftar nilai: setiap placeholder % di format diganti dengan nilai berikutnya. sprintf('%s is %d years old', 'Ada', 36) mengembalikan "Ada is 36 years old". printf() menerima argumen yang sama, tetapi mencetak hasilnya alih-alih mengembalikannya.

Placeholder diisi secara berurutan, dari kiri ke kanan. %.2f selalu menampilkan dua angka desimal (4.50, bukan 4.5), dan %05d menambahkan nol di depan angka sampai lima digit.

Format specifier

Sebuah placeholder terdiri dari %, modifier opsional, lalu satu huruf untuk tipenya:

SpecifierArtisprintf(...)Hasil
%sstringsprintf('%s', 'PHP')PHP
%dinteger (bertanda)sprintf('%d', 42.9)42
%ffloat, 6 desimal secara defaultsprintf('%f', 1.5)1.500000
%.2ffloat, 2 desimalsprintf('%.2f', 1.5)1.50
%enotasi ilmiahsprintf('%e', 1234.5678)1.234568e+3
%x / %Xheksadesimalsprintf('%x', 255)ff
%ooktalsprintf('%o', 8)10
%bbinersprintf('%b', 5)101
%ckarakter dari sebuah kodesprintf('%c', 65)A
%uinteger tak bertandasprintf('%u', 3)3
%%tanda persen biasasprintf('%d%%', 50)50%

Ubah nilai di bawah ini lalu jalankan lagi:

%d memotong float ke arah nol, jadi 42.9 menjadi 42. Kalau kamu ingin 43, bulatkan dulu: sprintf('%d', round(42.9)). String yang bukan angka, seperti 'abc', menjadi 0 di bawah %d.

Padding dengan nol di depan

Di antara % dan hurufnya, kamu bisa menaruh karakter padding dan lebar. %05d berarti "isi dengan 0 sampai lebar 5". Inilah cara yang biasa dipakai untuk memformat nomor pesanan, ID invoice, waktu, dan tanggal.

Lebar ini adalah batas minimum. Angka yang lebih panjang dari lebarnya tetap dicetak utuh.

%05.2f: lebar dan desimal sekaligus

Pada float, lebar menghitung setiap karakter hasilnya, termasuk titik desimal dan tanda minus. Itulah sebabnya %05.2f pada 3.14159 menghasilkan 03.14: total lima karakter, dua di antaranya setelah titik.

%f memakai pemisah desimal dari locale yang sedang aktif (diatur dengan setlocale()), sedangkan %F selalu memakai titik. Kalau kodemu mengatur locale dan kamu butuh titik untuk JSON, CSV, atau API, pakai %F.

Meratakan teks dalam kolom

Lebar positif meratakan ke kanan, tanda - sebelum lebar meratakan ke kiri, dan ' yang diikuti sebuah karakter menentukan karakter padding sendiri. Kalau digabung, semuanya bisa merapikan laporan dan struk dalam teks biasa.

%-14s menambahkan padding di kanan nama barang sampai 14 karakter, %8.2f meratakan harga ke kanan dalam 8 karakter, dan %'-27s dengan string kosong mencetak garis berisi 27 tanda hubung. %'*10s memakai * sebagai padding, bukan spasi.

Memberi nomor pada argumen untuk dipakai ulang atau diubah urutannya

%1$s berarti "argumen pertama sebagai string", %2$d berarti "argumen kedua sebagai integer". Placeholder bernomor membuatmu bisa memakai sebuah nilai dua kali atau mengubah urutannya tanpa mengubah daftar argumen, dan ini dibutuhkan penerjemah saat urutan kata berbeda antarbahasa.

vsprintf, printf, dan nilai kembaliannya

vsprintf() menerima nilai-nilainya sebagai satu array, yang praktis kalau nilai itu memang sudah ada di sebuah array. printf() mengembalikan jumlah byte yang dicetaknya, dan vprintf() adalah versi array dari printf().

Jumlah dari printf() ikut menghitung baris barunya, jadi "Hello\n" adalah 6 byte. Untuk teks multibyte, yang dihitung adalah byte, bukan karakter.

Argumen yang kurang memunculkan error

Sejak PHP 8, format yang placeholder-nya lebih banyak daripada nilainya akan melempar ArgumentCountError, bukan mengembalikan false. Hitung placeholder % (abaikan %%) saat kamu melihat error ini.

Pesan error-nya menghitung string format sebagai sebuah argumen: ArgumentCountError: 4 arguments are required, 3 given. Argumen yang berlebih diabaikan tanpa pemberitahuan, jadi kesalahan sebaliknya tidak muncul sebagai error. Kalau hasil sprintf terlihat salah, cetak format-nya di samping nilai-nilainya. Kalau yang kamu butuhkan hanya pemisah ribuan, number_format() lebih sederhana daripada menyusunnya dengan sprintf. Daftar lengkap modifier ada di php.net.

Pertanyaan yang sering diajukan

Bagaimana cara menambahkan nol di depan angka di PHP?

Pakai sprintf('%05d', 42), yang mengembalikan "00042". 0 adalah karakter padding dan 5 adalah lebar totalnya. Untuk string, str_pad('42', 5, '0', STR_PAD_LEFT) memberi hasil yang sama.

Bagaimana cara memformat angka menjadi 2 angka desimal dengan sprintf?

Pakai %.2f: sprintf('%.2f', 3.14159) mengembalikan "3.14" dan sprintf('%.2f', 5) mengembalikan "5.00". Tambahkan lebar untuk sekaligus memberi padding: %08.2f menghasilkan "00003.14".

Apa bedanya printf dan sprintf di PHP?

sprintf() mengembalikan string yang sudah diformat supaya bisa kamu simpan. printf() langsung mencetaknya dan mengembalikan jumlah byte yang dicetak. echo sprintf(...) dan printf(...) menghasilkan output yang sama.

Apa arti %s di PHP?

%s adalah placeholder untuk string di sprintf() dan printf(): sprintf('Hello, %s', 'Ada') mengembalikan "Hello, Ada". Angka yang diberikan ke %s diubah menjadi string. %d untuk integer dan %f untuk float.

Bagaimana cara memakai argumen yang sama dua kali di sprintf?

Beri nomor pada placeholder-nya: sprintf('%1$s loves %2$s, and %2$s loves %1$s', 'Ada', 'PHP'). Pakai tanda kutip tunggal untuk format-nya: di dalam tanda kutip ganda, PHP membaca $s sebagai variabel, sehingga "%1$s" menjadi %1 diikuti nilai $s.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai