Добавьте запятые или пробелы для группировки каждые три цифры - PullRequest
38 голосов
/ 22 июля 2011

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

function commafy( num ) {
  num.toString().replace( /\B(?=(?:\d{3})+)$/g, "," );
}

К сожалению, он не очень хорошо любит десятичные дроби. Учитывая следующие примеры использования, каков наилучший способ расширить мою функцию?

commafy( "123" )                 // "123"
commafy( "1234" )                // "1234"
                                 // Don't add commas until 5 integer digits
commafy( "12345" )               // "12,345"
commafy( "1234567" )             // "1,234,567"
commafy( "12345.2" )             // "12,345.2"
commafy( "12345.6789" )          // "12,345.6789"
                                 // Again, nothing until 5
commafy( ".123456" )             // ".123 456"
                                 // Group with spaces (no leading digit)
commafy( "12345.6789012345678" ) // "12,345.678 901 234 567 8"

Предположительно, самый простой способ - сначала разбить десятичную точку (если она есть). Куда лучше пойти оттуда?

Ответы [ 8 ]

80 голосов
/ 22 июля 2011

Просто разделите на две части с помощью «.»и отформатируйте их индивидуально.

function commafy( num ) {
    var str = num.toString().split('.');
    if (str[0].length >= 5) {
        str[0] = str[0].replace(/(\d)(?=(\d{3})+$)/g, '$1,');
    }
    if (str[1] && str[1].length >= 5) {
        str[1] = str[1].replace(/(\d{3})/g, '$1 ');
    }
    return str.join('.');
}
19 голосов
/ 18 января 2017

Просто так:

var theNumber = 3500;
theNumber.toLocaleString();
3 голосов
/ 06 октября 2016

Самый простой способ:

1

var num = 1234567890,
result = num.toLocaleString() ;// result will equal to "1 234 567 890"

2

var num = 1234567.890,
result = num.toLocaleString() + num.toString().slice(num.toString().indexOf('.')) // will equal to 1 234 567.890

3

var num = 1234567.890123,
result = Number(num.toFixed(0)).toLocaleString() + '.' + Number(num.toString().slice(num.toString().indexOf('.')+1)).toLocaleString()
//will equal to 1 234 567.890 123

4

ЕслиВы хотите ',' вместо '':

var num = 1234567.890123,
result = Number(num.toFixed(0)).toLocaleString().split(/\s/).join(',') + '.' + Number(num.toString().slice(num.toString().indexOf('.')+1)).toLocaleString()
//will equal to 1,234,567.890 123

Если не работает, установите параметр следующим образом: «toLocaleString ('ru-RU')» параметр «en-EN», разделит число на',' вместо ''

Все функции, используемые в моем коде, являются собственными функциями JS.Вы найдете их в GOOGLE или в любом учебнике / книге по JS

2 голосов
/ 22 июля 2011

Если вас устраивает целочисленная часть (я не смотрел на нее подробно), то:

function formatDecimal(n) {
  n = n.split('.');
  return commafy(n[0]) + '.' + n[1];
}

Конечно, вы можете сначала провести тестирование n , чтобы убедиться, что все в порядке, но это логика.

Редактировать

по электронной почте Ой! пропустил немного о пробелах! Вы можете использовать то же регулярное выражение, что и commafy, за исключением пробелов вместо запятых, а затем отменить результат.

Вот функция, основанная на vol7ron и не использующая реверс:

function formatNum(n) {
  var n = ('' + n).split('.');
  var num = n[0];
  var dec = n[1];
  var r, s, t;

  if (num.length > 3) {
    s = num.length % 3;

    if (s) {
      t = num.substring(0,s);
      num = t + num.substring(s).replace(/(\d{3})/g, ",$1");
    } else {
      num = num.substring(s).replace(/(\d{3})/g, ",$1").substring(1);
    }
  }

  if (dec && dec.length > 3) {
    dec = dec.replace(/(\d{3})/g, "$1 ");
  }

  return num + (dec? '.' + dec : '');
}
1 голос
/ 30 января 2015

Я немного расширил ответ # Робга и сделал пример jsfiddle

function formatNum(n, prec, currSign) {
    if(prec==null) prec=2;
  var n = ('' + parseFloat(n).toFixed(prec).toString()).split('.');
  var num = n[0];
  var dec = n[1];
  var r, s, t;

  if (num.length > 3) {
    s = num.length % 3;

    if (s) {
      t = num.substring(0,s);
      num = t + num.substring(s).replace(/(\d{3})/g, ",$1");
    } else {
      num = num.substring(s).replace(/(\d{3})/g, ",$1").substring(1);
    }
  }
    return (currSign == null ? "": currSign +" ") + num + (dec? '.' + dec : '');
}
alert(formatNum(123545.3434));
alert(formatNum(123545.3434,2));
alert(formatNum(123545.3434,2,'€'));

и расширил таким же образом ответ # Призрака

function commafy( num, prec, currSign ) {
    if(prec==null) prec=2;
    var str = parseFloat(num).toFixed(prec).toString().split('.');
    if (str[0].length >= 5) {
        str[0] = str[0].replace(/(\d)(?=(\d{3})+$)/g, '$1,');
    }
    if (str[1] && str[1].length >= 5) {
        str[1] = str[1].replace(/(\d{3})/g, '$1 ');
    }
    return (currSign == null ? "": currSign +" ") + str.join('.');
}

alert(commafy(123545.3434));
1 голос
/ 23 октября 2013

Это сработало для меня:

function commafy(inVal){
   var arrWhole = inVal.split(".");
   var arrTheNumber = arrWhole[0].split("").reverse();
   var newNum = Array();
   for(var i=0; i<arrTheNumber.length; i++){
          newNum[newNum.length] = ((i%3===2) && (i<arrTheNumber.length-1)) ? "," + arrTheNumber[i]: arrTheNumber[i];
   }
   var returnNum = newNum.reverse().join("");
   if(arrWhole[1]){
          returnNum += "." + arrWhole[1];
   }
   return returnNum;
}
1 голос
/ 22 июля 2011

Здесь вы можете редактировать после прочтения ваших комментариев.

function commafy( arg ) {
   arg += '';                                         // stringify
   var num = arg.split('.');                          // incase decimals
   if (typeof num[0] !== 'undefined'){
      var int = num[0];                               // integer part
      if (int.length > 4){
         int     = int.split('').reverse().join('');  // reverse
         int     = int.replace(/(\d{3})/g, "$1,");    // add commas
         int     = int.split('').reverse().join('');  // unreverse
      }
   }
   if (typeof num[1] !== 'undefined'){
      var dec = num[1];                               // float part
      if (dec.length > 4){
         dec     = dec.replace(/(\d{3})/g, "$1 ");    // add spaces
      }
   }

   return (typeof num[0] !== 'undefined'?int:'') 
        + (typeof num[1] !== 'undefined'?'.'+dec:'');
}
0 голосов
/ 22 июля 2011

Предполагая, что ваши примеры использования не являются репрезентативными для уже работающего кода, но вместо этого желаемого поведения, и вы ищете помощь с алгоритмом, я думаю, вы уже на правильном пути с разбиением на любые десятичные дроби.

После разделения примените существующее регулярное выражение к левой стороне, аналогичное регулярное выражение, добавив пробелы вместо запятых справа, а затем объедините их в одну строку перед возвратом.

Если, конечно, нет других соображений или я неправильно понял ваш вопрос.

...