İletişime geç

Sayıları 1K, 1,2M Şeklinde Kısaltma: PHP ve JavaScript

Görüntülenme, takipçi ve beğeni sayılarını 1,2 B ya da 3,4 Mn gibi kısa biçimde göstermek için PHP ve JavaScript örnekleri; Intl ile dil desteği.

Sayıları 1K, 1,2M Şeklinde Kısaltma: PHP ve JavaScript Yazılım

Bir yazının 12.483 kez okunduğunu göstermek yerine "12 B" yazmak hem daha az yer kaplar hem de daha kolay okunur. YouTube, Instagram ve X gibi platformların hepsi sayıları bu şekilde kısaltıyor. Bu blogdaki okunma sayıları için yazdığım çözümü ve modern alternatiflerini paylaşıyorum.

PHP ile basit bir fonksiyon

function kisalt(int|float $sayi, int $basamak = 1): string
{
    $birimler = ['', 'B', 'Mn', 'Mr', 'Tn']; // bin, milyon, milyar, trilyon
    $i = 0;
    while (abs($sayi) >= 1000 && $i < count($birimler) - 1) {
        $sayi /= 1000;
        $i++;
    }
    $metin = number_format($sayi, $i ? $basamak : 0, ',', '.');
    $metin = preg_replace('/,0+$/', '', $metin); // "2,0 B" yerine "2 B"

    return trim($metin.' '.$birimler[$i]);
}

echo kisalt(950);        // 950
echo kisalt(1250);       // 1,3 B
echo kisalt(48200);      // 48,2 B
echo kisalt(3481520);    // 3,5 Mn

İngilizce bir arayüz için birimleri ['', 'K', 'M', 'B', 'T'], ondalık ayracını da nokta yapmanız yeterli.

Yuvarlama tuzağı

Yukarıdaki fonksiyona 999950 verirseniz sonuç "1.000 B" olur; "1 Mn" görmeyi beklerdiniz. Bölmeden sonra yuvarlanan değerin 1000'e ulaşıp ulaşmadığını kontrol etmek gerekir:

$yuvarlanmis = round($sayi, $basamak);
if ($yuvarlanmis >= 1000 && $i < count($birimler) - 1) {
    $sayi = $yuvarlanmis / 1000;
    $i++;
}

Bu kontrolü döngüden sonra eklemeniz yeterli. Küçük bir detay ama tam olarak sınır değerlerde, en çok göze batan yerde ortaya çıkıyor.

PHP'de NumberFormatter yetmez mi?

PHP'nin intl eklentisindeki NumberFormatter sınıfı ondalık ayraçları ve para birimlerini dile göre biçimlendirmekte çok başarılı. Ancak "1,2 B" gibi kısa (compact) gösterimi doğrudan sunmuyor. Bu yüzden sunucu tarafında yukarıdaki gibi küçük bir fonksiyon hâlâ en pratik çözüm.

JavaScript: Intl.NumberFormat

Tarayıcılar bu işi yerleşik olarak yapabiliyor ve dile göre doğru kısaltmayı kendileri seçiyor:

const kisa = new Intl.NumberFormat('tr-TR', {
  notation: 'compact',
  maximumFractionDigits: 1,
});

kisa.format(1250);     // "1,3 B"
kisa.format(48200);    // "48,2 B"
kisa.format(3481520);  // "3,5 Mn"

new Intl.NumberFormat('en', { notation: 'compact' }).format(3481520); // "3.5M"

Formatlayıcıyı bir kez oluşturup tekrar kullanmak, her seferinde yeni nesne oluşturmaktan çok daha performanslı. Uzun listelerde bu fark hissediliyor.

Hangisini kullanmalı?

  • Sayı sunucuda üretilip sayfa önbelleğe alınıyorsa PHP fonksiyonu yeterli.
  • Sayı tarayıcıda canlı olarak güncelleniyorsa ya da site birden fazla dilde yayındaysa Intl.NumberFormat en temiz çözüm.

Erişilebilirlik için küçük bir not: kısaltılmış sayıyı gösterirken tam değeri title ya da aria-label özniteliğinde vermek, ekran okuyucu kullananlar ve fareyle üzerine gelenler için iyi bir dokunuş.

<span title="12.483 okunma">12,5 B</span>

Türkçe metinlerle çalışırken karşılaşılan bir başka klasik sorun da büyük-küçük harf dönüşümü. Onu da PHP'de Türkçe büyük-küçük harf dönüşümü yazısında anlattım.