Кто-нибудь знает хороший фрагмент javascript для форматирования сокращенных чисел?

Ключ сокращен. Например, 1m вместо 1000000 и 12k вместо 12000 и т. Д. - очень похоже на StackOverflow!

Я не уверен, что еще добавить, кроме того, что я пробовал:

format numbers abbreviated javascript
format numbers short javascript

И несколько других поисков и просмотр результатов безуспешно. Я чувствую, что кто-то, должно быть, делал это раньше, ненавижу изобретать колеса и все такое!

Ваше здоровье

Изменить: я хочу взять число, например 12345, и превратить его в 12k

Извините, я не совсем понял!


person joshcomley    schedule 24.06.2011    source источник
comment
12k также может быть 12288 - en.wikipedia.org/wiki/Kilobyte   -  person Boldewyn    schedule 24.06.2011
comment
Вы можете взглянуть на это или это и отмените это ...: )   -  person Felix Kling    schedule 24.06.2011
comment
Вы хотите 1000 -> 1k или 1k -> 1000?   -  person Felix Kling    schedule 24.06.2011


Ответы (3)


Вот код, который я написал довольно давно, но он отлично работает. Он даже поддерживает десятичные дроби.

function is_numeric(string) {
    for(var i = 0; i < string.length; i++) {
        if(string.charAt(i) < '0' || string.charAt(i) > '9') {
            return false;
        }
    }
    return true;
}

function charValueMultiplier(letter) {
    switch(letter) {
        case 'M':
        case 'm': return 1000000;
        case 'k':
        case 'K': return 1000;
        default: return 0;
    }
}

// parse string like 1.5M or 10k and return the number
function parseNumber(string) {
    string = string.replace(/ /g, ''); // remove spaces
    var total           = 0;
    var partial         = 0;
    var partialFraction = 0;
    var fractionLength  = 0;
    var isFraction      = false;

    // process the string; update total if we find a unit character
    for(var i = 0; i < string.length; i++) {
        var c = string.substr(i, 1);
        if(c == '.' || c == ',') {
            isFraction = true;
        }
        else if(is_numeric(c)) {
            if(isFraction) {
                partialFraction = partialFraction * 10 + parseInt(c, 10);
                fractionLength++;
            }
            else {
                partial = partial * 10 + parseInt(c, 10);
            }
        }
        else {
            total += charValueMultiplier(c) * partial + charValueMultiplier(c) * partialFraction / Math.pow(10, fractionLength);

            partial         = 0;
            partialFraction = 0;
            fractionLength  = 0;
            isFraction      = false;
        }
    }

    return Math.round(total + partial + partialFraction / Math.pow(10, fractionLength));
}
person ThiefMaster    schedule 24.06.2011
comment
Я думаю, вам следует добавить g к string.replace(/ /, ''), но кроме этого, я вам верю;) +1 - person Felix Kling; 24.06.2011
comment
Привет, новичок в js @ThiefMaster - легко ли можно конвертировать большие (bigint) числа, такие как триллион 10 ^ 12 (T), квадриллион 10 ^ 15 (P) и квинтиллион 10 ^ 18 (E) - если да, вы можете провести меня через пожалуйста, если у вас есть время - person soulshined; 16.09.2016

Я сделал пакет npm, который может сделать это за вас: https://www.npmjs.com/package/approximate-number

Использование для Node.js (или браузеров через Browserify):

npm install --save approximate-number

а затем в вашем коде:

var approx = require('approximate-number');
approx(123456); // "123k" 

Или для использования в браузерах через Bower:

bower install approximate-number

А потом

window.approximateNumber(123456); // "123k" 
person Nathan Friedly    schedule 14.12.2016

Если я правильно понял, у вас есть число n, и вы хотите преобразовать его в строку. потом

// n being the number to be formatted
var s = "" + n; // cast as string
if (n >= 1000000) {
  s = s.substring(0, s.length - 6) + "M";
} else if (n >= 1000) {
  s = s.substring(0, s.length - 3) + "k";
}

должен делать свою работу. Вы, конечно, можете расширить его для своих нужд или даже включить числа < 1.

person Boldewyn    schedule 24.06.2011
comment
Думаю, должно быть наоборот ... но я не уверен. - person Felix Kling; 24.06.2011