Регулярное выражение для форматирования чисел в JavaScript

Я должен отобразить отформатированное число на веб-странице с помощью JavaScript. Я хочу отформатировать его так, чтобы были запятые в правильных местах. Как я сделал бы это с регулярным выражением? Я добрался до чего-то вроде этого:

myString = myString.replace(/^(\d{3})*$/g, "${1},");

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

В основном я хочу эти результаты:

  • 45 становится 45
  • 3856 становится 3,856
  • 398868483992 становится 398,868,483,992

... Вы получаете идею.

42
задан Brandon Montgomery 12 February 2010 в 18:30
поделиться

8 ответов

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

-121--4180286-

Я просто называю его «нулевым T»

-121--3766505-

Это можно сделать в одном регексе, без необходимости итерации. Если ваш браузер поддерживает ECMAScript 2018, вы можете просто использовать поиск и просто вставить запятые в нужные места:

Поиск (? < =\d) (? = (\d\d\d) + (? !\d)) и заменить все на ,

В старых версиях JavaScript не поддерживает поиск, поэтому К счастью, нам нужно лишь немного изменить:

Поиск (\d) (? = (\d\d\d) + (? !\d)) и заменить все на \1,

Так, в JavaScript, что выглядело бы как:

result = subject.replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");

Объяснение: Утверждение, что с текущей позиции в последовательность и далее можно

Это также будет работать с десятичными разрядами (123456,78), если не слишком много цифр «справа от точки» (в противном случае вы получите 123 456.789 012).

Можно также определить его в прототипе числа следующим образом:

Number.prototype.format = function(){
   return this.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,");
};

И затем использовать его следующим образом:

var num = 1234;
alert(num.format());

Кредит: Джеффри Фридль, Мастер регулярных выражений, 3. издание , с. 66-67

113
ответ дан 26 November 2019 в 23:19
поделиться

// Возможно, вы захотите учесть десятичные числа

Number.prototype.commas= function(){
 var s= '', temp, 
 num= this.toString().split('.'), n=num[0];
 while(n.length> 3){
  temp= n.substring(n.length-3);
  s= ','+temp+s;
  n= n.slice(0, -3);
 }
 if(n) s= n+s;
 if(num[1]) s+='.'+num[1];
 return s;
}

var n= 10000000000.34;

n.commas() = возвращаемое значение: (String) 10,000,000,000.34

4
ответ дан 26 November 2019 в 23:19
поделиться

Если вы действительно хотите регулярное выражение, вы можете использовать два в цикле while:

while(num.match(/\d{4}/)) {
    num = num.replace(/(\d{3})(,\d|$)/, ',$1$2');
}

И если вы хотите быть необычным, вы также можете форматировать числа с десятичными точками:

while(num.match(/\d{4}(\,|\.)/)) {
    num = num.replace(/(\d{3})(,\d|$|\.)/, ',$1$2');
}

Изменить:

Вы также можете сделать это с помощью 2 регулярных выражений и без цикла, разделений, объединений и т. д .:

num = num.replace(/(\d{1,2}?)((\d{3})+)$/, "$1,$2");
num = num.replace(/(\d{3})(?=\d)/g, "$1,");

Первое регулярное выражение ставит запятую после первых 1 или 2 цифр, если оставшееся количество цифр делится на три. Второе регулярное выражение ставит запятую после каждой оставшейся группы из 3 цифр.

Они не работают с десятичными знаками, но отлично подходят для положительных и отрицательных целых чисел.

Тестовый вывод:

45
3,856
398,868,483,992

635
12,358,717,859,918,856
-1,388,488,184
2
ответ дан 26 November 2019 в 23:19
поделиться

Сначала переверните массив символов, затем добавьте запятые после каждого третьего числа, если только оно не находится непосредственно перед концом строки или перед знаком -. Затем снова переверните массив символов и снова сделайте его строкой.

function add_commas(numStr){
    return numStr.split('').reverse().join('').replace(/(\d{3})(?=[^$|^-])/g, "$1,").split('').reverse().join('');
}
0
ответ дан 26 November 2019 в 23:19
поделиться

Попробуйте что-нибудь вроде этого:

function add_commas(numStr)
{
    numStr += '';
    var x = numStr.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;
}
0
ответ дан 26 November 2019 в 23:19
поделиться

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

  1. Запустите регулярное выражение для одной цифры, за которой следуют 3 цифры.
  2. Если это регулярное выражение совпадает, замените его первой цифрой, затем запятой, а затем следующими тремя цифрами.
  3. Повторяйте, пока (1) не найдет совпадений.
0
ответ дан 26 November 2019 в 23:19
поделиться

Итерация не требуется

function formatNumber(n, separator) {
    separator = separator || ",";

    n = n.toString()
        .split("").reverse().join("")
        .replace(/(\d{3})/g, "$1" + separator)
        .split("").reverse().join("");

    // Strings that have a length that is a multiple of 3 will have a leading separator
    return n[0] == separator ? n.substr(1) : n;
}

var testCases = [1, 45, 2856, 398868483992];
for ( var i in testCases ) {
    if ( !ns.hasOwnProperty(i) ) { continue; }
    console.info(testCases[i]);   
    console.log(formatNumber(testCases[i]));
}

Результаты

1
1

45
45

2856
2,856

398868483992
398,868,483,992
0
ответ дан 26 November 2019 в 23:19
поделиться

Кто-то упомянул, что просмотр назад невозможен в Javascript RegExp. Вот отличная страница, на которой объясняется, как использовать поиск (просмотр вперед и назад).

http://www.regular-expressions.info/lookaround.html

1
ответ дан 26 November 2019 в 23:19
поделиться
Другие вопросы по тегам:

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