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
<?php
$nama = "Budi";
$nilai = 95;

$pesan = sprintf("Selamat, %s! Nilai kamu %d.", $nama, $nilai);

echo $pesan . "\n";

Output yang Dihasilkan:

text
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
<?php
printf("Halo, %s!\n", "Siti");
printf("Tahun terbit: %d\n", 2026);

Output yang Dihasilkan:

text
Halo, Siti!
Tahun terbit: 2026

Gunakan 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:

SpesifikasiArtiContoh pemakaianHasil
%sstring apa punsprintf("%s", "PHP")PHP
%dbilangan bulatsprintf("%d", 42)42
%fbilangan desimal, 6 digit defaultsprintf("%f", 1.5)1.500000
%.2fdesimal dengan 2 angka di belakang komasprintf("%.2f", 1.5)1.50
%05dbulat selebar 5, diisi nol di depansprintf("%05d", 42)00042
%+dbulat dengan tanda plus ditampilkansprintf("%+d", 42)+42
%%tanda persen literalsprintf("100%%")100%

Mari kita lihat semuanya bekerja dalam satu program:

php
<?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:

text
[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
<?php
printf("%-12s|%8s\n", "Produk", "Harga");
printf("%-12s|%8s\n", "Kopi", "25000");
printf("%-12s|%8s\n", "Gula Aren", "15000");

Output yang Dihasilkan:

text
Produk      |   Harga
Kopi        |   25000
Gula Aren   |   15000

Spesifikasi %-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
<?php
$total = 1250000.5;

echo number_format($total) . "\n";
echo number_format($total, 2, ",", ".") . "\n";

Output yang Dihasilkan:

text
1,250,001
1.250.000,50

Tanpa 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
<?php
$dataPembeli = ["Siti", 3];

echo vsprintf("Halo %s, pesanan %d item sedang dikirim.\n", $dataPembeli);

Output yang Dihasilkan:

text
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
<?php
echo sprintf('%2$s mengirim pesan ke %1$s', "Budi", "Siti") . "\n";

Output yang Dihasilkan:

text
Siti mengirim pesan ke Budi

Meskipun "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
<?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:

text
======== STRUK BELANJA =========
Kopi Toraja 250g  x2    50.000
Gula Aren 500g    x1    15.000
--------------------------------
TOTAL                Rp65.000

Mari kita bedah baris demi baris:

  1. Baris 6 (str_pad(...)): judul STRUK BELANJA diratakan tengah pada lebar 32 karakter dengan pengisi =, menjadi kepala struk.
  2. Baris 8-9 (printf(...)): tiap barang diratakan kiri selebar 17 karakter, jumlahnya menyusul setelah x, dan subtotal dari number_format() diratakan kanan pada kolom 9 — semua baris barang berakhir di kolom yang sama.
  3. Baris 10 (str_repeat(...)): garis pemisah sepanjang 32 karakter, senada dengan lebar kepala struk.
  4. Baris 11 (printf(...)): label TOTAL menempati kolom 21 karakter agar nilai Rp65.000 tepat 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
<?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, ",", "."));