Как напечатать число с запятыми в качестве разделителей тысяч в JavaScript - PullRequest
1445 голосов
/ 25 мая 2010

Я пытаюсь напечатать целое число в JavaScript с запятыми в качестве разделителей тысяч. Например, я хочу показать число 1234567 как «1,234,567». Как бы я поступил так?

Вот как я это делаю:

function numberWithCommas(x) {
    x = x.toString();
    var pattern = /(-?\d+)(\d{3})/;
    while (pattern.test(x))
        x = x.replace(pattern, "$1,$2");
    return x;
}

Есть ли более простой или элегантный способ сделать это? Было бы хорошо, если бы он работал и с поплавками, но это не обязательно. Он не должен зависеть от локали, чтобы выбирать между точками и запятыми.

Ответы [ 44 ]

1 голос
/ 30 мая 2018

Я нашел подход, который работает в любой ситуации. Пример CodeSandbox

function commas(n) {
  if (n < 1000) {
    return n + ''
  } else {
    // Convert to string.
    n += ''

    // Skip scientific notation.
    if (n.indexOf('e') !== -1) {
      return n
    }

    // Support fractions.
    let i = n.indexOf('.')
    let f = i == -1 ? '' : n.slice(i)
    if (f) n = n.slice(0, i)

    // Add commas.
    i = n.length
    n = n.split('')
    while (i > 3) n.splice((i -= 3), 0, ',')
    return n.join('') + f
  }
}

Это похоже на ответ Ноа Фрейтаса , но с поддержкой дробей и научных обозначений .

Я думаю, toLocaleString - лучший выбор, если производительность не является проблемой.

edit: Вот CodeSandbox с некоторыми примерами: https://codesandbox.io/s/zmvxjpj6x

1 голос
/ 14 мая 2018

Не найдя здесь современного и комплексного решения, я написал функцию стрелки (без регулярных выражений) для решения проблемы форматирования, которая позволяет вызывающей стороне указывать число цифр дроби , а также точка и разделитель тысяч для Европы и остального мира.

Примеры:

numberFormatter(1234567890.123456) => 1,234,567,890
numberFormatter(1234567890.123456, 4) => 1,234,567,890.1235
numberFormatter(1234567890.123456, 4, '.', ',') => 1.234.567.890,1235 Europe

Вот функция, записанная в ES6 (современный синтаксис):

const numberFormatter = (number, fractionDigits = 0, thousandSeperator = ',', fractionSeperator = '.') => {
    if (number!==0 && !number || !Number.isFinite(number)) return number
    const frDigits = Number.isFinite(fractionDigits)? Math.min(Math.max(fractionDigits, 0), 7) : 0
    const num = number.toFixed(frDigits).toString()

    const parts = num.split('.')
    let digits = parts[0].split('').reverse()
    let sign = ''
    if (num < 0) {sign = digits.pop()}
    let final = []
    let pos = 0

    while (digits.length > 1) {
        final.push(digits.shift())
        pos++
        if (pos % 3 === 0) {final.push(thousandSeperator)}
    }
    final.push(digits.shift())
    return `${sign}${final.reverse().join('')}${frDigits > 0 ? fractionSeperator : ''}${frDigits > 0 && parts[1] ? parts[1] : ''}`
}

Он был проверен на отрицательный, плохой ввод и NaN . Если ввод NaN , он просто возвращает его.

1 голос
/ 07 января 2017

Если вы используете AngularJS, есть фильтр валют, который определенно может помочь: http://www.w3schools.com/angular/ng_filter_currency.asp

0 голосов
/ 21 мая 2014

Вы можете просто использовать printf -way, например:

double number = 1234567;
System.out.printf("%,.2f" , number);
0 голосов
/ 24 мая 2018

Вы можете использовать циклы для добавления запятых к числу

function convertNumber(){
    var _cash = cash.toString()
    var _formattedCash = ''
    var count = 0

    for (let i = _cash.length; i >= 0; i--) {
        _formattedCash += _cash.substring(i,i+1)

        if(count == 3 && i > 0){
            _formattedCash += ','
            count = 0
        }
        count++
    }

    var _format = ''

    for (let i = _formattedCash.length; i >= 0; i--) {
        _format += _formattedCash.substring(i, i + 1)
    }

    return 'Ksh ' + _format;
}
0 голосов
/ 28 апреля 2018

function addCommas(nStr) {
    nStr += '';
    var x = nStr.split('.');
    var x1 = x[0];
    var x2 = x.length > 1 ? '.' + x[1] : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1)) {
            x1 = x1.replace(rgx, '$1' + ',' + '$2');
    }
    return x1 + x2;
}

addCommas(parseFloat("1099920.23232").toFixed(2)); //Output  1,099,920.23
0 голосов
/ 19 ноября 2013

Еще один .. (для int, как задает вопрос)

function insertCommas(str)
{
    var a = str.split("");
    a.reverse();

    var t, i = 0, arr = Array();

    while (t = a.shift())
    {
       if (((i++ % 3) == 0) && arr.length > 0)
           arr.unshift(",");
       arr.unshift(t);
    }

    return arr.join("");
}
0 голосов
/ 22 сентября 2017

Это однострочная функция с поддержкой int и decimal. Я оставил некоторый код для преобразования числа в строку.

    function numberWithCommas(x) {
        return (x=x+'').replace(new RegExp('\\B(?=(\\d{3})+'+(~x.indexOf('.')?'\\.':'$')+')','g'),',');
    }
0 голосов
/ 11 июля 2014

Для индийской системы счисления

var number = "323483.85"
var decimal = number.split(".");
var res = (decimal[0].length>3? numberWithCommas(decimal[0].substring(0,decimal[0].length-3))+ ',' :decimal[0]) + (decimal[0].length>3?decimal[0].substring(decimal[0].length-3,decimal[0].length):'') + '.' + decimal[1];

Выход: 3,23,483,85

0 голосов
/ 12 марта 2014

Вот хорошее решение с меньшим количеством кодирования ...

var y = "";
var arr = x.toString().split("");
for(var i=0; i<arr.length; i++)
{
    y += arr[i];
    if((arr.length-i-1)%3==0 && i<arr.length-1) y += ",";
}
...