number_format($number, $decimals) mengembalikan angka sebagai string dengan pemisah ribuan dan jumlah desimal yang tetap: number_format(1234567.891, 2) mengembalikan "1,234,567.89". Dengan satu argumen, fungsi ini membulatkan ke bilangan bulat: number_format(1234567.891) menghasilkan "1,234,568".
Keempat parameternya
number_format(
float $num,
int $decimals = 0,
?string $decimal_separator = ".",
?string $thousands_separator = ","
): string
Argumen ketiga adalah karakter di antara bagian bulat dan desimal, argumen keempat adalah karakter di antara kelompok tiga digit. Keduanya bisa berupa string apa pun, termasuk string kosong atau karakter multibyte. Ubah pemisah di bawah ini untuk melihat setiap gaya:
Data locale (CLDR) memakai narrow no-break space (U+202F) untuk bahasa Prancis dan no-break space (U+00A0) untuk bahasa Rusia, sehingga sebuah angka tidak pernah terpotong ke dua baris. Di HTML, berikan "\u{202F}" atau "\u{00A0}" sebagai pemisah alih-alih spasi biasa.
Memformat angka tanpa pemisah ribuan
Berikan '' sebagai argumen keempat. Kamu mendapat angka biasa dengan jumlah desimal yang tetap, bentuk yang diharapkan oleh payment gateway, ekspor CSV, dan nilai <input type="number">:
Untuk baris terakhir, round() sebelum cast itu penting: 19.9 * 100 disimpan sebagai 1989.9999999999998, dan (int) saja akan memotongnya menjadi 1989.
Cara number_format membulatkan
number_format() membulatkan setengah menjauhi nol, seperti round(), jadi 0.5 menjadi 1 dan -2.5 menjadi -3. Fungsi ini juga mengoreksi kesalahan biner yang sangat kecil pada nilai seperti 2.675, itulah sebabnya hasilnya bisa berbeda dengan sprintf('%.2f'):
2.675 tidak bisa disimpan dengan tepat dalam biner; nilai yang tersimpan sedikit di bawahnya. sprintf() memformat nilai yang tersimpan itu dan mendapat 2.67, sedangkan number_format() dan round() memperlakukannya sebagai 2.675 yang kamu tulis. Jika kamu butuh aturan pembulatan tertentu, panggil round(), floor(), atau ceil() sendiri lebih dulu (lihat pembulatan dan matematika) lalu berikan hasilnya ke number_format().
Memformat uang dan mata uang lain
number_format() tidak tahu apa pun tentang mata uang, jadi kamu menambahkan simbolnya sendiri. Taruh tanda negatif sebelum simbol, dan ingat bahwa yen tidak punya desimal:
Untuk output yang mengikuti locale dengan posisi simbol yang tepat untuk setiap negara, NumberFormatter dari extension intl mengerjakan semuanya:
$fmt = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
echo $fmt->formatCurrency(1234.5, 'EUR'); // 1.234,50 € (a no-break space before €)
Fungsi ini membutuhkan extension intl, yang tidak terpasang di semua tempat, jadi number_format() dengan simbolmu sendiri adalah pilihan yang paling portabel.
Hasilnya string, bukan angka
Inilah bug paling umum dengan number_format(): memformat sebuah nilai lalu melakukan perhitungan dengannya. "1,234.50" bukan string numerik, jadi PHP hanya membaca 1 sebelum koma:
<?php
echo number_format(1234.5, 2) + 1;
Warning: A non-numeric value encountered in /home/index.php on line 2
2
Memberikan string seperti itu kembali ke number_format() lebih buruk lagi: hasilnya TypeError: number_format(): Argument #1 ($num) must be of type int|float, string given. Simpan angka mentahnya untuk perhitungan dan format hanya pada saat kamu mencetak. Jika kamu menerima string yang sudah diformat dari form atau file, hapus pemisahnya lebih dulu:
Untuk padding, perataan, atau tanda plus di depan angka, pakai sprintf(); fungsi itu tidak menambahkan pemisah ribuan, tetapi mengatur lebar dan tanda.
Pertanyaan yang sering diajukan
Bagaimana cara memformat angka dengan koma di PHP?
Panggil number_format($n): number_format(1234567) mengembalikan "1,234,567". Berikan argumen kedua untuk desimal: number_format(1234567.891, 2) mengembalikan "1,234,567.89".
Bagaimana cara memakai number_format tanpa koma?
Berikan string kosong sebagai pemisah ribuan: number_format(1234.5, 2, '.', '') mengembalikan "1234.50". Inilah bentuk yang biasanya diharapkan oleh API pembayaran dan file CSV.
Apakah number_format membulatkan atau memotong?
Fungsi ini membulatkan, setengah menjauhi nol: number_format(2.5) menghasilkan "3", number_format(-2.5) menghasilkan "-3", dan number_format(2.675, 2) menghasilkan "2.68". Untuk memotong desimal, pakai floor() lebih dulu: number_format(floor(2.679 * 100) / 100, 2) menghasilkan "2.67".
Bagaimana cara memformat angka dengan gaya Eropa (1.234,56)?
Tukar pemisahnya dengan argumen ketiga dan keempat: number_format(1234.56, 2, ',', '.') mengembalikan "1.234,56". Gaya Prancis dan Swiss memakai spasi atau apostrof sebagai argumen keempat.
Kenapa number_format memberi hasil yang salah saat saya menambahkan sesuatu padanya?
number_format() mengembalikan string seperti "1,234.50", dan PHP hanya membaca 1 sebelum koma saat kamu melakukan perhitungan dengannya. Simpan angkanya untuk perhitungan dan panggil number_format() hanya saat kamu mencetaknya.