number_format($number, $decimals) sayıyı bir binlik ayırıcı ve sabit sayıda ondalıkla bir dizge olarak döndürür: number_format(1234567.891, 2) "1,234,567.89" döndürür. Tek argümanla tam sayıya yuvarlar: number_format(1234567.891) "1,234,568" olur.
Dört parametre
number_format(
float $num,
int $decimals = 0,
?string $decimal_separator = ".",
?string $thousands_separator = ","
): string
Üçüncü argüman tam kısım ile ondalıklar arasındaki karakter, dördüncüsü üçlü basamak grupları arasındaki karakterdir. İkisi de boş bir dizge veya çok baytlı bir karakter dahil herhangi bir dizge olabilir. Her stili görmek için aşağıdaki ayırıcıları düzenleyin:
Yerel ayar verileri (CLDR) Fransızca için dar bölünemez boşluk (U+202F), Rusça için bölünemez boşluk (U+00A0) kullanır, böylece bir sayı asla iki satıra bölünmez. HTML'de ayırıcı olarak düz bir boşluk yerine "\u{202F}" veya "\u{00A0}" verin.
Bir sayıyı binlik ayırıcı olmadan biçimlendirme
Dördüncü argüman olarak '' verin. Sabit sayıda ondalıklı düz bir sayı elde edersiniz; ödeme ağ geçitlerinin, CSV dışa aktarımlarının ve <input type="number"> değerlerinin beklediği biçim budur:
Son satır için dönüştürmeden önceki round() önemlidir: 19.9 * 100 1989.9999999999998 olarak saklanır ve tek başına (int) onu 1989 değerine keserdi.
number_format nasıl yuvarlar
number_format() round() gibi yarımı sıfırdan uzağa doğru yuvarlar, bu yüzden 0.5 1, -2.5 ise -3 olur. Ayrıca 2.675 gibi değerlerdeki küçük ikili hatayı düzeltir; sprintf('%.2f') ile farklı sonuç verebilmesinin nedeni budur:
2.675 ikili sistemde tam olarak saklanamaz; saklanan değer ondan çok az küçüktür. sprintf() saklanan bu değeri biçimlendirir ve 2.67 bulur, number_format() ve round() ise onu yazdığınız 2.675 olarak ele alır. Belirli bir yuvarlama kuralına ihtiyacınız varsa önce round(), floor() veya ceil() fonksiyonunu kendiniz çağırın (yuvarlama ve matematik sayfasına bakın) ve sonucu number_format() fonksiyonuna verin.
Para ve diğer para birimlerini biçimlendirme
number_format() para birimleri hakkında hiçbir şey bilmez, bu yüzden simgeyi kendiniz eklersiniz. Eksi işaretlerini simgeden önce koyun ve yenin ondalığı olmadığını unutmayın:
Her ülke için doğru simge konumuyla yerel ayara duyarlı çıktı için intl eklentisinin NumberFormatter sınıfı işin tamamını yapar:
$fmt = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
echo $fmt->formatCurrency(1234.5, 'EUR'); // 1.234,50 € (a no-break space before €)
Her yerde kurulu olmayan intl eklentisini gerektirir, bu yüzden kendi simgenizle number_format() taşınabilir seçimdir.
Sonuç bir sayı değil, bir dizgedir
number_format() ile en yaygın hata budur: bir değeri biçimlendirip ardından onunla hesap yapmak. "1,234.50" sayısal bir dizge değildir, bu yüzden PHP yalnızca virgülden önceki 1 değerini okur:
<?php
echo number_format(1234.5, 2) + 1;
Warning: A non-numeric value encountered in /home/index.php on line 2
2
Böyle bir dizgeyi number_format() fonksiyonuna geri vermek daha kötüdür: TypeError: number_format(): Argument #1 ($num) must be of type int|float, string given fırlatır. Matematik için ham sayıyı tutun ve yalnızca yazdırdığınız anda biçimlendirin. Bir formdan veya dosyadan biçimlendirilmiş bir dizge alırsanız önce ayırıcıları temizleyin:
Sayının önünde doldurma, hizalama veya artı işareti için bunun yerine sprintf() kullanın; binlik ayırıcı eklemez ama genişliği ve işareti kontrol eder.
Sıkça Sorulan Sorular
PHP'de bir sayıyı virgüllerle nasıl biçimlendiririm?
number_format($n) çağırın: number_format(1234567) "1,234,567" döndürür. Ondalıklar için ikinci bir argüman verin: number_format(1234567.891, 2) "1,234,567.89" döndürür.
number_format'ı virgülsüz nasıl kullanırım?
Binlik ayırıcı olarak boş bir dizge verin: number_format(1234.5, 2, '.', '') "1234.50" döndürür. Ödeme API'leri ve CSV dosyaları genellikle bu biçimi bekler.
number_format yuvarlar mı yoksa keser mi?
Yarımı sıfırdan uzağa doğru yuvarlar: number_format(2.5) "3", number_format(-2.5) "-3" ve number_format(2.675, 2) "2.68" olur. Ondalıkları kesmek için önce floor() kullanın: number_format(floor(2.679 * 100) / 100, 2) "2.67" verir.
Sayıları Avrupa usulü (1.234,56) nasıl biçimlendiririm?
Üçüncü ve dördüncü argümanlarla ayırıcıların yerini değiştirin: number_format(1234.56, 2, ',', '.') "1.234,56" döndürür. Fransız ve İsviçre biçimleri dördüncü argüman olarak bir boşluk veya kesme işareti kullanır.
number_format sonucuna ekleme yaptığımda neden yanlış sonuç alıyorum?
number_format() "1,234.50" gibi bir dizge döndürür ve onunla işlem yaptığınızda PHP yalnızca virgülden önceki 1 değerini okur. Hesaplamalar için sayıyı tutun ve number_format() fonksiyonunu yalnızca yazdırırken çağırın.