Bir sayıyı bin veya daha fazlaysa 2,5K olarak biçimlendirin, aksi takdirde 900


Yanıtlar:


209

Bunun gibi sesler sizin için çalışmalı:

function kFormatter(num) {
    return Math.abs(num) > 999 ? Math.sign(num)*((Math.abs(num)/1000).toFixed(1)) + 'k' : Math.sign(num)*Math.abs(num)
}
    
console.log(kFormatter(1200)); // 1.2k
console.log(kFormatter(-1200)); // -1.2k
console.log(kFormatter(900)); // 900
console.log(kFormatter(-900)); // -900


2
Küçük düzeltme önerildi ... Binlerce küçük harf k olmalıdır. Üst kısım Kilos içindir. Düzenlemeye çalıştı, ancak alınmadan önce en az 6 karakter değiştirildi.
Adam Youngers

Buraya bir php değişkeni ekleyebilir ve nasıl kullanabilirim? yani benim sayı değişkenim $mynumber_outputbunu kullanmak için nereye eklemek? Örneğin, $mynumber_output= 12846 diyelim, 12846'ya dönüştürülmesini istiyorum12.8k

Bazı durumlarda bir kilobaytın 1024 bayt olduğunu unutmayın: en.wikipedia.org/wiki/Kilobyte
Olle Härstedt

1000 ekran 1k yerine 1.0k olarak nasıl yapılabilir?
Brent

1
Kullanıcının sorusuna tamamen cevap vermez. "M'ye ihtiyacım olacak evet ... Yardımcı olabilir misin?" - Carl Weis
tfmontague

217

Daha genel bir sürüm:

function nFormatter(num, digits) {
  var si = [
    { value: 1, symbol: "" },
    { value: 1E3, symbol: "k" },
    { value: 1E6, symbol: "M" },
    { value: 1E9, symbol: "G" },
    { value: 1E12, symbol: "T" },
    { value: 1E15, symbol: "P" },
    { value: 1E18, symbol: "E" }
  ];
  var rx = /\.0+$|(\.[0-9]*[1-9])0+$/;
  var i;
  for (i = si.length - 1; i > 0; i--) {
    if (num >= si[i].value) {
      break;
    }
  }
  return (num / si[i].value).toFixed(digits).replace(rx, "$1") + si[i].symbol;
}

/*
 * Tests
 */
var tests = [
  { num: 1234, digits: 1 },
  { num: 100000000, digits: 1 },
  { num: 299792458, digits: 1 },
  { num: 759878, digits: 1 },
  { num: 759878, digits: 0 },
  { num: 123, digits: 1 },
  { num: 123.456, digits: 1 },
  { num: 123.456, digits: 2 },
  { num: 123.456, digits: 4 }
];
var i;
for (i = 0; i < tests.length; i++) {
  console.log("nFormatter(" + tests[i].num + ", " + tests[i].digits + ") = " + nFormatter(tests[i].num, tests[i].digits));
}


@SalmanA - Büyük yardım, eğer biri arg olarak dize olarak geçerse, parseFloat ile temizlenirse başarısız olur. Teşekkür ederim!
Adesh M

1
<1000'den küçük sayılar için küçük düzeltme, var si = öğesine {değer: 1E0, sembol: ""}
ekleyin

1
Sadece yerini @GiovanniAzua if (num >= si[i].value)ileif (Math.abs(num) >= si[i].value)
Salman A

ne gelmez .replace(rx, "$1")mi?
M.Octavio

1
@ M.Octavio regex, izleyen sıfırları kırpmak için kullanılır, örneğin 1.0olur 1ve 1.10olur1.1
Salman A

78

İşte tüm ififadeleri (gücü ile Math) önleyen basit bir çözüm .

var SI_SYMBOL = ["", "k", "M", "G", "T", "P", "E"];

function abbreviateNumber(number){

    // what tier? (determines SI symbol)
    var tier = Math.log10(number) / 3 | 0;

    // if zero, we don't need a suffix
    if(tier == 0) return number;

    // get suffix and determine scale
    var suffix = SI_SYMBOL[tier];
    var scale = Math.pow(10, tier * 3);

    // scale the number
    var scaled = number / scale;

    // format number and add suffix
    return scaled.toFixed(1) + suffix;
}

Bonus Meme

Ne anlama geliyor SI?


Çözümünü gerçekten seviyorum. Negatif değerleri de kısaltmak için, Math.log10 (negativeValue) NaN döndüreceğinden, katmanı belirlemeden önce ve sonra sayıyı -1 ile çarparım.
xhadon

Sadece kullanmak Math.absbunun gibi, negatif sayılar için destek eklemek için: var tier = Math.log10(Math.abs(number)) / 3 | 0;.
Caio Tarifa

72

Salman'ın Cevabını daha da iyileştirir çünkü nFormatter (33000) 'i 33.0K olarak döndürür

function nFormatter(num) {
     if (num >= 1000000000) {
        return (num / 1000000000).toFixed(1).replace(/\.0$/, '') + 'G';
     }
     if (num >= 1000000) {
        return (num / 1000000).toFixed(1).replace(/\.0$/, '') + 'M';
     }
     if (num >= 1000) {
        return (num / 1000).toFixed(1).replace(/\.0$/, '') + 'K';
     }
     return num;
}

şimdi nFormatter (33000) = 33K


2
Neyse, sayıyı yuvarlamadan bunu yapmak için? 1,590,000 1,6 milyon geri dönecek.
Brett Hardin

3
Bazen mevcut olanı düzenlemek için ne zaman yeni bir cevap yayınlayacağımı bilmek zor, karar vermek için kullandığım bir şey, başka bir kullanıcının cevabından kodu çalarsam, genellikle cevaplarını düzenlerim, böylece benim yerine çalma yerine tanıma alabilirler kodu.
MH

@Yash sayaç betiğinde uygulamaya çalıştığım kodum ama bu almıyorum benim kodpen link codepen.io/Merajkhan/pen/MMoxGE?editors=1010 İstediğim bu mantığı nasıl uygulayacağımı bana yardım edebilir misin K, L, M birimleri gelmek zorunda.
Mehraj Han

Harika. Kısa ve Tatlı çözüm.
Hasitha Jayawardana

22
/**
 * Shorten number to thousands, millions, billions, etc.
 * http://en.wikipedia.org/wiki/Metric_prefix
 *
 * @param {number} num Number to shorten.
 * @param {number} [digits=0] The number of digits to appear after the decimal point.
 * @returns {string|number}
 *
 * @example
 * // returns '12.5k'
 * shortenLargeNumber(12543, 1)
 *
 * @example
 * // returns '-13k'
 * shortenLargeNumber(-12567)
 *
 * @example
 * // returns '51M'
 * shortenLargeNumber(51000000)
 *
 * @example
 * // returns 651
 * shortenLargeNumber(651)
 *
 * @example
 * // returns 0.12345
 * shortenLargeNumber(0.12345)
 */
function shortenLargeNumber(num, digits) {
    var units = ['k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'],
        decimal;

    for(var i=units.length-1; i>=0; i--) {
        decimal = Math.pow(1000, i+1);

        if(num <= -decimal || num >= decimal) {
            return +(num / decimal).toFixed(digits) + units[i];
        }
    }

    return num;
}

Thx @ Yorum için, Math.round10 bağımlılığını kaldırdım.


1
Eğer değerini değiştirebilirsiniz Math.abs(num) >= decimal.
Conor Pender

18

Math nesneleri, harita nesneleri, for-loop'lar, regex, vb. Kullanarak bu iş parçacığındaki birçok yanıt oldukça karmaşık hale gelir. Ancak bu yaklaşımlar kodun okunabilirliğini veya performansını gerçekten artırmaz. Basit bir yaklaşım en iyi tasarımı sunar.

Nakit değeri K ile biçimlendirme

const formatCash = n => {
  if (n < 1e3) return n;
  if (n >= 1e3) return +(n / 1e3).toFixed(1) + "K";
};

console.log(formatCash(2500));

Nakit değeri KMBT ile biçimlendirme

const formatCash = n => {
  if (n < 1e3) return n;
  if (n >= 1e3 && n < 1e6) return +(n / 1e3).toFixed(1) + "K";
  if (n >= 1e6 && n < 1e9) return +(n / 1e6).toFixed(1) + "M";
  if (n >= 1e9 && n < 1e12) return +(n / 1e9).toFixed(1) + "B";
  if (n >= 1e12) return +(n / 1e12).toFixed(1) + "T";
};

console.log(formatCash(1235000));

Negatif sayılar kullanma

let format;
const number = -1235000;

if (number < 0) {
  format = '-' + formatCash(-1 * number);
} else {
  format = formatCash(number);
}

1
@Jan - Yazımı bir örnekle güncelledi, ancak negatif formu hesaplamak için yeterince basit olduğunu hissettim'-' + formatCash(-1 * number)
tfmontague

16

ES2020, Intl.NumberFormatnotasyonu aşağıdaki gibi kullanarak bölümüne destek ekler :

console.log(Intl.NumberFormat('en-US', { notation: "compact" , compactDisplay: "short" }).format(987654321));

NumberFormat gözlük:

Şu anda tüm tarayıcıların ES2020'yi desteklemediğini unutmayın, bu nedenle bu Çoklu Dolgu'ya ihtiyacınız olabilir: https://formatjs.io/docs/polyfills/intl-numberformat


Bu paket kullanımdan kaldırılmıştır, bu yüzden lütfen bu bağlantıyı kullanın: npmjs.com/package/@formatjs/intl-numberformat
Ammad Khalid

2
Not: Chrome notationve özelliklerini destekler, compactDisplayancak FireFox 77 ve Safari 13.1 hala desteklememektedir, bu nedenle muhtemelen çoklu doldurmaya ihtiyacınız olacaktır.
Josh Unger

Vay, Firefox sadece v. 78 yılında bu desteği eklendi, öyle görünüyor. Tabii ki, 2 yıl sonra, bu yorum aptalca görünecek. : P (Kod benim için çalışıyor, ancak düzgün bir şekilde dönüştürülmediği için benim için komik olsa da, bu yüzden bir güncelleme yapmam gerekecek.)
Andrew

15

İsterseniz Waylon Flinn'e Kredi Ver

Bu, negatif sayıları ve ".0" davasını ele almak için daha zarif yaklaşımından geliştirildi.

Ne kadar az döngü ve "if" vakanız varsa, o kadar iyi IMO.

function abbreviateNumber(number) {
    var SI_POSTFIXES = ["", "k", "M", "G", "T", "P", "E"];
    var tier = Math.log10(Math.abs(number)) / 3 | 0;
    if(tier == 0) return number;
    var postfix = SI_POSTFIXES[tier];
    var scale = Math.pow(10, tier * 3);
    var scaled = number / scale;
    var formatted = scaled.toFixed(1) + '';
    if (/\.0$/.test(formatted))
      formatted = formatted.substr(0, formatted.length - 2);
    return formatted + postfix;
}

jsFiddle ile test senaryoları -> https://jsfiddle.net/xyug4nvz/7/


1
Hala can sıkıcı bir hata var: abbreviateNumber(999999) == '1000k'yerine '1M'. Çünkü toFixed()sayıları da yuvarlar. Yine de nasıl düzeltebileceğinden emin değilim: /
Vitor Baptista

@VitorBaptista toFixed()Sayıyı yine de yuvarlarsa, göndermeden önce sayıyı yuvarlayabilirsiniz, bunun yerine abbreviateNumber()döndürür . Bir çözüm değil, bir çözüm. 1M1000k
forsureitsme

2
Yuvarlama istemiyorsanız, ölçek adımından sonra bunu yapabilirsiniz:const floored = Math.floor(scaled * 10) / 10;
tybro0103

11

bu oldukça zarif.

function formatToUnits(number, precision) {
  const abbrev = ['', 'k', 'm', 'b', 't'];
  const unrangifiedOrder = Math.floor(Math.log10(Math.abs(number)) / 3)
  const order = Math.max(0, Math.min(unrangifiedOrder, abbrev.length -1 ))
  const suffix = abbrev[order];

  return (number / Math.pow(10, order * 3)).toFixed(precision) + suffix;
}

formatToUnits(12345, 2)
==> "12.35k"
formatToUnits(0, 3)
==> "0.000"

4

Sen kullanabilirsiniz d3 formatlı Python Gelişmiş dize Biçimlendirme sonra modellenmiştir paketi PEP3101 :

var f = require('d3-format')
console.log(f.format('.2s')(2500)) // displays "2.5k"

3

@ Yash'ın cevabını negatif sayı desteği ile daha da iyileştirmek:

function nFormatter(num) {
    isNegative = false
    if (num < 0) {
        isNegative = true
    }
    num = Math.abs(num)
    if (num >= 1000000000) {
        formattedNumber = (num / 1000000000).toFixed(1).replace(/\.0$/, '') + 'G';
    } else if (num >= 1000000) {
        formattedNumber =  (num / 1000000).toFixed(1).replace(/\.0$/, '') + 'M';
    } else  if (num >= 1000) {
        formattedNumber =  (num / 1000).toFixed(1).replace(/\.0$/, '') + 'K';
    } else {
        formattedNumber = num;
    }   
    if(isNegative) { formattedNumber = '-' + formattedNumber }
    return formattedNumber;
}

nFormatter(-120000)
"-120K"
nFormatter(120000)
"120K"

3

Bu yazı oldukça eski ama bir şekilde bu gönderiye bir şey ararken ulaştım. Benim giriş eklemek SO Sayısal js şimdi bir gün tek durak çözümdür. Sayıların biçimlendirilmesine yardımcı olmak için çok sayıda yöntem sunar

http://numeraljs.com/


1
artık sayılar korunmaz. En aktif çatal numbro gibi görünüyor . Ancak ikisi de SI / metrik gösterimini desteklemiyor
Vincent de Lagabbe

3

Kısa ve genel yöntem

Sen yapabilir COUNT_FORMATS, uzun veya kısa istediğiniz kadar yapılandırma nesnesi., Sen test değerlerinin aralığına bağlı.

// Configuration    
const COUNT_FORMATS =
[
  { // 0 - 999
    letter: '',
    limit: 1e3
  },
  { // 1,000 - 999,999
    letter: 'K',
    limit: 1e6
  },
  { // 1,000,000 - 999,999,999
    letter: 'M',
    limit: 1e9
  },
  { // 1,000,000,000 - 999,999,999,999
    letter: 'B',
    limit: 1e12
  },
  { // 1,000,000,000,000 - 999,999,999,999,999
    letter: 'T',
    limit: 1e15
  }
];
    
// Format Method:
function formatCount(value)
{
  const format = COUNT_FORMATS.find(format => (value < format.limit));

  value = (1000 * value / format.limit);
  value = Math.round(value * 10) / 10; // keep one decimal number, only if needed

  return (value + format.letter);
}

// Test:
const test = [274, 1683, 56512, 523491, 9523489, 5729532709, 9421032489032];
test.forEach(value => console.log(`${ value } >>> ${ formatCount(value) }`));


1

En üstteki cevaba ekleyerek, bu 1.0k yerine 1000 için 1k verecektir.

function kFormatter(num) {
    return num > 999 ? num % 1000 === 0 ? (num/1000).toFixed(0) + 'k' : (num/1000).toFixed(1) + 'k' : num
}

1

Negatif üsleri destekleyen Waylon Flinn'in cevabının değiştirilmiş bir versiyonu:

function metric(number) {

  const SI_SYMBOL = [
    ["", "k", "M", "G", "T", "P", "E"], // +
    ["", "m", "μ", "n", "p", "f", "a"] // -
  ];

  const tier = Math.floor(Math.log10(Math.abs(number)) / 3) | 0;

  const n = tier < 0 ? 1 : 0;

  const t = Math.abs(tier);

  const scale = Math.pow(10, tier * 3);

  return {
    number: number,
    symbol: SI_SYMBOL[n][t],
    scale: scale,
    scaled: number / scale
  }
}

function metric_suffix(number, precision) {
  const m = metric(number);
  return (typeof precision === 'number' ? m.scaled.toFixed(precision) : m.scaled) + m.symbol;
}

for (var i = 1e-6, s = 1; i < 1e7; i *= 10, s *= -1) {
  // toggles sign in each iteration
  console.log(metric_suffix(s * (i + i / 5), 1));
}

console.log(metric(0));

Beklenen çıktı:

   1.2μ
 -12.0μ
 120.0μ
  -1.2m
  12.0m
-120.0m
   1.2
 -12.0
 120.0
  -1.2k
  12.0k
-120.0k
   1.2M
{ number: 0, symbol: '', scale: 1, scaled: 0 }

1
  • Negatif sayı desteği
  • Kontrol ediliyor !Number.isFinite
  • Değişim ' K M G T P E Z Y'için ' K M'size maksimum birimdir istiyorsanızM

Aşağıdaki kod 1K = 1024'tür, 1K = 1000 istiyorsanız, tüm 1024'ü 1000 olarak değiştirin.


Number.prototype.prefix = function (precision = 2) {

    var units = ' K M G T P E Z Y'.split(' ');

    if (this < 0) {
        return '-' + Math.abs(this).prefix(precision);
    }

    if (this < 1) {
        return this + units[0];
    }

    var power = Math.min(
        Math.floor(Math.log(this) / Math.log(1024)),
        units.length - 1
    );

    return (this / Math.pow(1024, power)).toFixed(precision) + units[power];
}

console.log('10240 = ' + (10240).prefix()) // 10.00K
console.log('1234000 = ' + (1234000).prefix(1)) // 1.2M
console.log('10000 = ' + (-10000).prefix()) // -9.77K


(11000) .prefix () 10.74K'ye eşit değil çok doğru değil 11.00K
bmaggi

1
@bmaggi 1024 - 1000'i değiştirin
Steely Wing

1

Ondalık basamakları biçimlendirmek için @ tfmontague'in cevabını daha da iyileştirmek. 33,0 - 33k

largeNumberFormatter(value: number): any {
   let result: any = value;

   if (value >= 1e3 && value < 1e6) { result = (value / 1e3).toFixed(1).replace(/\.0$/, '') + 'K'; }
   if (value >= 1e6 && value < 1e9) { result = (value / 1e6).toFixed(1).replace(/\.0$/, '') + 'M'; }
   if (value >= 1e9) { result = (value / 1e9).toFixed(1).replace(/\.0$/, '') + 'T'; }

   return result;
}

1

Gönderilen çözümlerin hiçbirinden memnun kalmadım, işte benim sürümüm:

  1. Pozitif ve negatif sayıları destekler
  2. Negatif üsleri destekler
  3. Mümkünse bir sonraki üsse kadar yuvarlar
  4. Sınır kontrolü yapar (çok büyük / küçük sayılar için hata yapmaz)
  5. Sondaki sıfırları / boşlukları çıkarır
  6. Bir hassasiyet parametresini destekler

    function abbreviateNumber(number,digits=2) {
      var expK = Math.floor(Math.log10(Math.abs(number)) / 3);
      var scaled = number / Math.pow(1000, expK);
    
      if(Math.abs(scaled.toFixed(digits))>=1000) { // Check for rounding to next exponent
        scaled /= 1000;
        expK += 1;
      }
    
      var SI_SYMBOLS = "apμm kMGTPE";
      var BASE0_OFFSET = SI_SYMBOLS.indexOf(' ');
    
      if (expK + BASE0_OFFSET>=SI_SYMBOLS.length) { // Bound check
        expK = SI_SYMBOLS.length-1 - BASE0_OFFSET;
        scaled = number / Math.pow(1000, expK);
      }
      else if (expK + BASE0_OFFSET < 0) return 0;  // Too small
    
      return scaled.toFixed(digits).replace(/(\.|(\..*?))0+$/,'$2') + SI_SYMBOLS[expK+BASE0_OFFSET].trim();
    }
    
    //////////////////
    
    const tests = [
      [0.0000000000001,2],
      [0.00000000001,2],
      [0.000000001,2],
      [0.000001,2],
      [0.001,2],
      [0.0016,2],
      [-0.0016,2],
      [0.01,2],
      [1,2],
      [999.99,2],
      [999.99,1],
      [-999.99,1],
      [999999,2],
      [999999999999,2],
      [999999999999999999,2],
      [99999999999999999999,2],
    ];
    
    for (var i = 0; i < tests.length; i++) {
      console.log(abbreviateNumber(tests[i][0], tests[i][1]) );
    }


1

Golf bir çok kod ile geldi ve çok kısa!

var beautify=n=>((Math.log10(n)/3|0)==0)?n:Number((n/Math.pow(10,(Math.log10(n)/3|0)*3)).toFixed(1))+["","K","M","B","T",][Math.log10(n)/3|0];

console.log(beautify(1000))
console.log(beautify(10000000))


1

1000K döndüren nFormatter (999999,1) gibi durumlar nedeniyle Salman'ın Cevabını daha da iyileştirmek.

function formatNumberWithMetricPrefix(num, digits = 1) {
  const si = [
    {value: 1e18, symbol: 'E'},
    {value: 1e15, symbol: 'P'},
    {value: 1e12, symbol: 'T'},
    {value: 1e9, symbol: 'G'},
    {value: 1e6, symbol: 'M'},
    {value: 1e3, symbol: 'k'},
    {value: 0, symbol: ''},
  ];
  const rx = /\.0+$|(\.[0-9]*[1-9])0+$/;
  function divideNum(divider) {
    return (num / (divider || 1)).toFixed(digits);
  }

  let i = si.findIndex(({value}) => num >= value);
  if (+divideNum(si[i].value) >= 1e3 && si[i - 1]) {
    i -= 1;
  }
  const {value, symbol} = si[i];
  return divideNum(value).replace(rx, '$1') + symbol;
}

1

Bunu yapmanın en basit ve en kolay yolu

new Intl.NumberFormat('en-IN', { 
    notation: "compact",
    compactDisplay: "short",
    style: 'currency',
    currency: 'INR'
}).format(1000).replace("T", "K")

Bu herhangi bir sayı için geçerlidir. Dahil L Crvb.


1

@ Martin-sznapka çözümündeki döngüyü ortadan kaldırarak, yürütme süresini% 40 oranında azaltırsınız.

function formatNum(num,digits) {
    let units = ['k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'];
    let floor = Math.floor(Math.abs(num).toString().length / 3);
    let value=+(num / Math.pow(1000, floor))
    return value.toFixed(value > 1?digits:2) + units[floor - 1];

}

Bu iplikten farklı çözüm için hız testi (200000 rastgele örnek)

Execution time: formatNum          418  ms
Execution time: kFormatter         438  ms it just use "k" no "M".."T" 
Execution time: beautify           593  ms doesnt support - negatives
Execution time: shortenLargeNumber 682  ms    
Execution time: Intl.NumberFormat  13197ms 

0
/*including negative values*/    
function nFormatter(num) {
      let neg = false;
       if(num < 0){
         num = num * -1;
         neg = true;
       }
       if (num >= 1000000000) {
         if(neg){
           return -1 * (num / 1000000000).toFixed(1).replace(/\.0$/, '') + 'G';  
         }
         return (num / 1000000000).toFixed(1).replace(/\.0$/, '') + 'G';
       }
       if (num >= 1000000) {
         if(neg){
           return -1 * (num / 1000000).toFixed(1).replace(/\.0$/, '') + 'M';  
         }
         return (num / 1000000).toFixed(1).replace(/\.0$/, '') + 'M';
       }
       if (num >= 1000) {
         if(neg){
           return -1 * (num / 1000).toFixed(1).replace(/\.0$/, '') + 'K';  
         }
         return (num / 1000).toFixed(1).replace(/\.0$/, '') + 'K';
       }
       return num;
    }

pls çözümünüzün bir açıklaması ekleyin
Harun Diluka Heshan

0

Bu işlev, büyük sayıları (hem pozitif hem de negatif) hassasiyetini kaybetmeden okuyucu dostu bir formata dönüştürebilir:

function abbrNum(n) {
    if (!n || (n && typeof n !== 'number')) {
      return '';
    }

    const ranges = [
      { divider: 1e12 , suffix: 't' },
      { divider: 1e9 , suffix: 'b' },
      { divider: 1e6 , suffix: 'm' },
      { divider: 1e3 , suffix: 'k' }
    ];
    const range = ranges.find(r => Math.abs(n) >= r.divider);
    if (range) {
      return (n / range.divider).toString() + range.suffix;
    }
    return n.toString();
}

/* test cases */
let testAry = [99, 1200, -150000, 9000000];
let resultAry = testAry.map(abbrNum);
console.log("result array: " + resultAry);


0

Bu işlevi kullanıyorum. Hem için çalışır phpve javascript.

    /**
     * @param $n
     * @return string
     * Use to convert large positive numbers in to short form like 1K+, 100K+, 199K+, 1M+, 10M+, 1B+ etc
     */
 function num_format($n) {
        $n_format = null;
        $suffix = null;
        if ($n > 0 && $n < 1000) {
           $n_format = Math.floor($n);   
            $suffix = '';
        }
        else if ($n == 1000) {
            $n_format = Math.floor($n / 1000);   //For PHP only use floor function insted of Math.floor()
            $suffix = 'K';
        }
        else if ($n > 1000 && $n < 1000000) {
            $n_format = Math.floor($n / 1000);
            $suffix = 'K+';
        } else if ($n == 1000000) {
            $n_format = Math.floor($n / 1000000);
            $suffix = 'M';
        } else if ($n > 1000000 && $n < 1000000000) {
            $n_format = Math.floor($n / 1000000);
            $suffix = 'M+';
        } else if ($n == 1000000000) {
            $n_format = Math.floor($n / 1000000000);
            $suffix = 'B';
        } else if ($n > 1000000000 && $n < 1000000000000) {
            $n_format = Math.floor($n / 1000000000);
            $suffix = 'B+';
        } else if ($n == 1000000000000) {
            $n_format = Math.floor($n / 1000000000000);
            $suffix = 'T';
        } else if ($n >= 1000000000000) {
            $n_format = Math.floor($n / 1000000000000);
            $suffix = 'T+';
        }


       /***** For PHP  ******/
       //  return !empty($n_format . $suffix) ? $n_format . $suffix : 0;

       /***** For Javascript ******/
        return ($n_format + $suffix).length > 0 ? $n_format + $suffix : 0;
    }

0

İhtiyaçlarımı karşılamak için @ Novellizator'ın cevabını çok genişletmeye karar verdim. Harici kütüphaneler olmadan biçimlendirme gereksinimlerimin çoğunu karşılamak için esnek bir işlev istedim.

Özellikleri

  • Sipariş soneklerini kullanma seçeneği (k, M vb.)
    • Kullanılacak sipariş soneklerinin özel bir listesini belirleme seçeneği
    • Minimum ve maksimum siparişleri sınırlama seçeneği
  • Ondalık basamak sayısı kontrolü
  • Otomatik sipariş ayırıcı virgül
  • İsteğe bağlı yüzde veya dolar biçimlendirmesi
  • Sayısal olmayan giriş durumunda ne döndürüleceğini kontrol etme
  • Negatif ve sonsuz sayılarda çalışır

Örnekler

let x = 1234567.8;
formatNumber(x);  // '1,234,568'
formatNumber(x, {useOrderSuffix: true});  // '1M'
formatNumber(x, {useOrderSuffix: true, decimals: 3, maxOrder: 1});  // '1,234.568k'
formatNumber(x, {decimals: 2, style: '$'});  // '$1,234,567.80'

x = 10.615;
formatNumber(x, {style: '%'});  // '1,062%'
formatNumber(x, {useOrderSuffix: true, decimals: 1, style: '%'});  // '1.1k%'
formatNumber(x, {useOrderSuffix: true, decimals: 5, style: '%', minOrder: 2});  // '0.00106M%'

formatNumber(-Infinity);  // '-∞'
formatNumber(NaN);  // ''
formatNumber(NaN, {valueIfNaN: NaN});  // NaN

fonksiyon

/*
 * Return the given number as a formatted string.  The default format is a plain
 * integer with thousands-separator commas.  The optional parameters facilitate
 * other formats:
 *   - decimals = the number of decimals places to round to and show
 *   - valueIfNaN = the value to show for non-numeric input
 *   - style
 *     - '%': multiplies by 100 and appends a percent symbol
 *     - '$': prepends a dollar sign
 *   - useOrderSuffix = whether to use suffixes like k for 1,000, etc.
 *   - orderSuffixes = the list of suffixes to use
 *   - minOrder and maxOrder allow the order to be constrained.  Examples:
 *     - minOrder = 1 means the k suffix should be used for numbers < 1,000
 *     - maxOrder = 1 means the k suffix should be used for numbers >= 1,000,000
 */
function formatNumber(number, {
    decimals = 0,
    valueIfNaN = '',
    style = '',
    useOrderSuffix = false,
    orderSuffixes = ['', 'k', 'M', 'B', 'T'],
    minOrder = 0,
    maxOrder = Infinity
  } = {}) {

  let x = parseFloat(number);

  if (isNaN(x))
    return valueIfNaN;

  if (style === '%')
    x *= 100.0;

  let order;
  if (!isFinite(x) || !useOrderSuffix)
    order = 0;
  else if (minOrder === maxOrder)
    order = minOrder;
  else {
    const unboundedOrder = Math.floor(Math.log10(Math.abs(x)) / 3);
    order = Math.max(
      0,
      minOrder,
      Math.min(unboundedOrder, maxOrder, orderSuffixes.length - 1)
    );
  }

  const orderSuffix = orderSuffixes[order];
  if (order !== 0)
    x /= Math.pow(10, order * 3);

  return (style === '$' ? '$' : '') +
    x.toLocaleString(
      'en-US',
      {
        style: 'decimal',
        minimumFractionDigits: decimals,
        maximumFractionDigits: decimals
      }
    ) +
    orderSuffix +
    (style === '%' ? '%' : '');
}

0

Vay burada çok cevap var. Okuması en kolay gibi görünen, negatif sayıları işlediğinden ve JavaScript için kilo sayı aralığından çok uzak gibi göründüğünü nasıl çözeceğimi düşündüm. İstediğiniz şeyi değiştirmek veya daha da genişletmek de kolay olacaktır.

const symbols = [
  { value: 1, symbol: '' },
  { value: 1e3, symbol: 'k' },
  { value: 1e6, symbol: 'M' },
  { value: 1e9, symbol: 'G' },
  { value: 1e12, symbol: 'T' },
  { value: 1e15, symbol: 'P' },
  { value: 1e18, symbol: 'E' }
];

function numberFormatter(num, digits) {
  const numToCheck = Math.abs(num);
  for (let i = symbols.length - 1; i >= 0; i--) {
    if (numToCheck >= symbols[i].value) {
      const newNumber = (num / symbols[i].value).toFixed(digits);
      return `${newNumber}${symbols[i].symbol}`;
    }
  }
  return '0';
}

const tests = [
  { num: 1234, digits: 1 },
  { num: 100000000, digits: 1 },
  { num: 299792458, digits: 1 },
  { num: 759878, digits: 1 },
  { num: -759878, digits: 0 },
  { num: 123, digits: 1 },
  { num: 123.456, digits: 1 },
  { num: -123.456, digits: 2 },
  { num: 123.456, digits: 4 }
];
for (let i = 0; i < tests.length; i++) {
  console.log(`numberFormatter(${tests[i].num}, ${tests[i].digits})=${numberFormatter(tests[i].num, tests[i].digits)}`);
}


0

Daha kısa bir alternatif:

function nFormatter(num) {
    const format = [
      { value: 1e18, symbol: 'E' },
      { value: 1e15, symbol: 'P' },
      { value: 1e12, symbol: 'T' },
      { value: 1e9, symbol: 'G' },
      { value: 1e6, symbol: 'M' },
      { value: 1e3, symbol: 'k' },
      { value: 1, symbol: '' },
    ];
    const formatIndex = format.findIndex((data) => num >= data.value);
    console.log(formatIndex)
    return (num / format[formatIndex === -1? 6: formatIndex].value).toFixed(2) + format[formatIndex === -1?6: formatIndex].symbol;
  }
  

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.