У меня есть функция для добавления запятых к числам:
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"
По-видимому, самый простой способ - сначала разделить на десятичную точку (если она есть). Куда лучше идти?
Вот два кратких способа, которыми я думаю, возможно, полезный:
Этот метод может преобразовать номер к строке с чувствительным к языку представлением. Это позволяет два параметра, который является locales
& options
. Те параметры могут немного сбивать с толку, поскольку больше детали видит что документ от MDN выше.
, Одним словом, Вы могли просто использовать, как указано ниже:
console.log(
Number(1234567890.12).toLocaleString()
)
// log -> "1,234,567,890.12"
, Если Вы видите отличающийся со мной, что, потому что мы игнорируем и два параметра и это возвратит строковую основу в Вашей операционной системе.
, Почему мы рассматриваем это? Эти
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