Добавляйте запятые или пробелы для группировки каждые три цифры

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

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"

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

39
задан Sophie Alpert 22 July 2011 в 21:24
поделиться

1 ответ

Вот два кратких способа, которыми я думаю, возможно, полезный:

  1. Number.prototype.toLocaleString

Этот метод может преобразовать номер к строке с чувствительным к языку представлением. Это позволяет два параметра, который является locales & options. Те параметры могут немного сбивать с толку, поскольку больше детали видит что документ от MDN выше.

, Одним словом, Вы могли просто использовать, как указано ниже:

console.log(
   Number(1234567890.12).toLocaleString()
)
// log -> "1,234,567,890.12"

, Если Вы видите отличающийся со мной, что, потому что мы игнорируем и два параметра и это возвратит строковую основу в Вашей операционной системе.

  1. Использование regex для соответствия строке тогда заменяют к новой строке.

    , Почему мы рассматриваем это? Эти toLocaleString() немного сбивает с толку и не весь поддерживаемый браузер, также toLocaleString() будет вокруг десятичного числа, таким образом, мы можем сделать это в другом отношении.

// The steps we follow are:
// 1. Converts a number(integer) to a string.
// 2. Reverses the string.
// 3. Replace the reversed string to a new string with the Regex
// 4. Reverses the new string to get what we want.

// This method is use to reverse a string.
function reverseString(str) { 
    return str.split("").reverse().join("");  
}

/**
 * @param {string | number} 
 */
function groupDigital(num) {
  const emptyStr = '';
  const group_regex = /\d{3}/g;

  // delete extra comma by regex replace.
  const trimComma = str => str.replace(/^[,]+|[,]+$/g, emptyStr)


  const str = num + emptyStr;
  const [integer, decimal] = str.split('.')

  const conversed = reverseString(integer);

  const grouped = trimComma(reverseString(
    conversed.replace(/\d{3}/g, match => `${match},`)
  ));

  return !decimal ? grouped : `${grouped}.${decimal}`;
}


console.log(groupDigital(1234567890.1234)) // 1,234,567,890.1234
console.log(groupDigital(123456))  // 123,456
console.log(groupDigital("12.000000001"))  // 12.000000001

1
ответ дан 27 November 2019 в 02:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: