Interpolasi variabel cukup untuk pesan sehari-hari, tetapi keluaran yang serius menuntut presisi: kolom harga yang rata kanan, angka desimal yang selalu dua digit, nomor dokumen dengan nol di depan, dan tanda persen yang tidak boleh tertelan format. Untuk kebutuhan tersebut PHP menyediakan keluarga sprintf() yang bekerja seperti cetakan (template): kita menulis pola dengan penanda tempat, lalu nilai-nilai mengisi tempat tersebut. Pada Chapter ini kita akan menguasai spesifikasi format yang paling sering dipakai, memformat angka gaya Indonesia dengan number_format(), lalu merangkai semuanya menjadi struk belanja yang rapi.
Menyusun Template dengan sprintf #
sprintf() menerima string format berisi penanda tempat (placeholder) yang diawali tanda persen, diikuti argumen-argumen nilai pengisinya, lalu mengembalikan string hasil:
<?php
$nama = "Budi";
$nilai = 95;
$pesan = sprintf("Selamat, %s! Nilai kamu %d.", $nama, $nilai);
echo $pesan . "\n";Output yang Dihasilkan:
Selamat, Budi! Nilai kamu 95.Penanda %s digantikan nilai argumen pertama ($nama) dan %d digantikan argumen kedua ($nilai), sehingga hasilnya kalimat utuh Selamat, Budi! Nilai kamu 95.. Berbeda dari interpolation, format dan data terpisah rapi — template yang sama bisa disimpan sebagai konstanta, dibaca dari berkas konfigurasi, atau dipakai ulang dengan nilai berbeda-beda. Nilai kembalian berupa string juga berarti hasilnya bisa disimpan, dikirim, atau dibandingkan sebelum dicetak.
Mencetak Langsung dengan printf #
printf() adalah sprintf() yang langsung mencetak: format dan argumennya sama persis, hasilnya langsung dikirim ke keluaran tanpa perantara variabel:
<?php
printf("Halo, %s!\n", "Siti");
printf("Tahun terbit: %d\n", 2026);Output yang Dihasilkan:
Halo, Siti!
Tahun terbit: 2026Gunakan printf() saat hasil hanya ingin ditampilkan, dan sprintf() saat hasil masih akan diolah lebih lanjut. Keduanya membaca spesifikasi format yang sama, sehingga keahlian yang satu berlaku untuk yang lain.
Spesifikasi Format yang Sering Dipakai #
Kekuatan sesungguhnya ada pada huruf dan angka di balik tanda persen. Tabel berikut merangkum spesifikasi yang paling sering Anda perlukan:
| Spesifikasi | Arti | Contoh pemakaian | Hasil |
|---|---|---|---|
%s | string apa pun | sprintf("%s", "PHP") | PHP |
%d | bilangan bulat | sprintf("%d", 42) | 42 |
%f | bilangan desimal, 6 digit default | sprintf("%f", 1.5) | 1.500000 |
%.2f | desimal dengan 2 angka di belakang koma | sprintf("%.2f", 1.5) | 1.50 |
%05d | bulat selebar 5, diisi nol di depan | sprintf("%05d", 42) | 00042 |
%+d | bulat dengan tanda plus ditampilkan | sprintf("%+d", 42) | +42 |
%% | tanda persen literal | sprintf("100%%") | 100% |
Mari kita lihat semuanya bekerja dalam satu program:
<?php
printf("[%s]\n", "PHP");
printf("[%d]\n", 42);
printf("[%f]\n", 1.5);
printf("[%.2f]\n", 1.5);
printf("[%05d]\n", 42);
printf("[%+d]\n", 42);
printf("[100%%]\n");Output yang Dihasilkan:
[PHP]
[42]
[1.500000]
[1.50]
[00042]
[+42]
[100%]Tanda kurung siku berperan sebagai penanda tepi. %f memang boros: enam digit desimal adalah bawaannya, sehingga 1.5 tampil sebagai 1.500000 — presisi seperti %.2f biasanya yang kita inginkan untuk uang. Spesifikasi %05d menggabungkan dua ide sekaligus: lebar lima karakter diisi nol dari kiri, solusi bawaan untuk nomor invoice yang sebelumnya kita kerjakan dengan str_pad() pada Chapter Trimming dan Padding
.
Lebar Kolom dan Perataan #
Angka di antara % dan huruf tipe menentukan lebar minimum kolom, dan tanda minus membalik perataan ke kiri. Kombinasi ini adalah fondasi keluaran berkolom yang rapi:
<?php
printf("%-12s|%8s\n", "Produk", "Harga");
printf("%-12s|%8s\n", "Kopi", "25000");
printf("%-12s|%8s\n", "Gula Aren", "15000");Output yang Dihasilkan:
Produk | Harga
Kopi | 25000
Gula Aren | 15000Spesifikasi %-12s meratakan nama produk ke kiri pada kolom selebar dua belas karakter, sedangkan %8s meratakan harga ke kanan pada kolom delapan. Hasilnya tabel yang lurus sempurna: harga 25000 dan 15000 berakhir di kolom yang sama meski panjang namanya berbeda. Lebar minimum berarti teks yang lebih panjang dari kolom tetap ditampilkan utuh — kolom hanya akan melebar sejauh itu, tidak memotong isi.
Format Angka Rupiah dengan number_format #
%f dan %.2f mengikuti gaya Inggris: titik sebagai pemisah desimal dan tanpa pemisah ribuan. Untuk angka gaya Indonesia — titik ribuan dan koma desimal — fungsi yang tepat adalah number_format():
<?php
$total = 1250000.5;
echo number_format($total) . "\n";
echo number_format($total, 2, ",", ".") . "\n";Output yang Dihasilkan:
1,250,001
1.250.000,50Tanpa argumen tambahan, number_format() membulatkan ke bilangan bulat dengan gaya Inggris: 1,250,001. Tiga argumen berikutnya mengubah semuanya — jumlah desimal 2, pemisah desimal ,, dan pemisah ribuan . — menghasilkan 1.250.000,50 sebagaimana tertulis di kuitansi Indonesia. Kombinasikan dengan sprintf() atau penyambungan string untuk menambahkan Rp di depannya.
vsprintf dan Penomoran Argumen #
Dua variasi terakhir melengkapi keluarga ini. vsprintf() menerima nilai pengisi dalam bentuk array — berguna ketika data dibangun secara dinamis, misalnya hasil pembacaan berkas atau baris database:
<?php
$dataPembeli = ["Siti", 3];
echo vsprintf("Halo %s, pesanan %d item sedang dikirim.\n", $dataPembeli);Output yang Dihasilkan:
Halo Siti, pesanan 3 item sedang dikirim.Penanda tempat juga bisa dinomori: %1$s merujuk argumen pertama dan %2$s argumen kedua, sehingga urutan pengisian lepas dari urutan argumen:
<?php
echo sprintf('%2$s mengirim pesan ke %1$s', "Budi", "Siti") . "\n";Output yang Dihasilkan:
Siti mengirim pesan ke BudiMeskipun "Budi" berada di argumen pertama, %2$s mengambil "Siti" lebih dulu — hasilnya Siti mengirim pesan ke Budi. Penomoran seperti ini menyelamatkan penerjemahan pesan: bahasa lain boleh membalik urutan subjek dan objek tanpa mengubah urutan data yang dikirim.
Contoh Lengkap: Struk Belanja #
Saatnya merangkai seluruh chapter menjadi satu program struk belanja yang memakai printf(), number_format(), plus str_pad() dan str_repeat() dari chapter sebelumnya:
<?php
$subtotalKopi = 2 * 25000;
$subtotalGula = 1 * 15000;
$total = $subtotalKopi + $subtotalGula;
echo str_pad(" STRUK BELANJA ", 32, "=", STR_PAD_BOTH) . "\n";
printf("%-17s x%d %9s\n", "Kopi Toraja 250g", 2, number_format($subtotalKopi, 0, ",", "."));
printf("%-17s x%d %9s\n", "Gula Aren 500g", 1, number_format($subtotalGula, 0, ",", "."));
echo str_repeat("-", 32) . "\n";
printf("%-21s%8s\n", "TOTAL", "Rp" . number_format($total, 0, ",", "."));Output yang Dihasilkan:
======== STRUK BELANJA =========
Kopi Toraja 250g x2 50.000
Gula Aren 500g x1 15.000
--------------------------------
TOTAL Rp65.000Mari kita bedah baris demi baris:
- Baris 6 (
str_pad(...)): judulSTRUK BELANJAdiratakan tengah pada lebar 32 karakter dengan pengisi=, menjadi kepala struk. - Baris 8-9 (
printf(...)): tiap barang diratakan kiri selebar 17 karakter, jumlahnya menyusul setelahx, dan subtotal darinumber_format()diratakan kanan pada kolom 9 — semua baris barang berakhir di kolom yang sama. - Baris 10 (
str_repeat(...)): garis pemisah sepanjang 32 karakter, senada dengan lebar kepala struk. - Baris 11 (
printf(...)): labelTOTALmenempati kolom 21 karakter agar nilaiRp65.000tepat sejajar dengan kolom subtotal di atasnya.
Perhatikan bahwa number_format() dipanggil lebih dulu menghasilkan string "50.000", barulah printf() meratakan string tersebut — dua fungsi berbagi tugas sesuai keahliannya masing-masing. Struktur seperti ini, dengan baris barang yang ditulis berulang, juga titik yang tepat untuk disederhanakan menjadi perulangan setelah kita menguasai Section Control Flow.
Berkas contoh.php pada bagian bawah halaman memuat program struk di atas dalam bentuk utuh yang dapat langsung Anda jalankan.
Ringkasan #
Keluarga sprintf() mengisi penanda tempat pada template: %s untuk string, %d untuk bulat, %.2f untuk desimal presisi, %05d untuk nol di depan, %% untuk persen literal, sementara lebar kolom dan tanda minus mengatur perataan. printf() mencetak langsung, vsprintf() mengisi dari array, dan number_format() mengurus gaya angka Indonesia. Dengan perangkat ini, kita sudah mampu menghasilkan keluaran teks yang rapi dan terukur. Topik olah teks berikutnya sedikit berbeda coraknya: menyeragamkan bentuk teks itu sendiri — huruf besar-kecil dan penulisan yang baku — pada Chapter Text Normalization.
Referensi #
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
contoh.php
Unduh berkas<?php
// Contoh lengkap: struk belanja dengan printf dan number_format
$subtotalKopi = 2 * 25000;
$subtotalGula = 1 * 15000;
$total = $subtotalKopi + $subtotalGula;
echo str_pad(" STRUK BELANJA ", 32, "=", STR_PAD_BOTH) . "\n";
printf("%-17s x%d %9s\n", "Kopi Toraja 250g", 2, number_format($subtotalKopi, 0, ",", "."));
printf("%-17s x%d %9s\n", "Gula Aren 500g", 1, number_format($subtotalGula, 0, ",", "."));
echo str_repeat("-", 32) . "\n";
printf("%-21s%8s\n", "TOTAL", "Rp" . number_format($total, 0, ",", "."));