Я должен отобразить отформатированное число на веб-странице с помощью JavaScript. Я хочу отформатировать его так, чтобы были запятые в правильных местах. Как я сделал бы это с регулярным выражением? Я добрался до чего-то вроде этого:
myString = myString.replace(/^(\d{3})*$/g, "${1},");
... и затем реализованный это было бы более сложно, чем я думаю (и regex выше даже не близко к тому, в чем я нуждаюсь). Я сделал некоторый поиск, и мне нелегко находить что-то, что работает на это.
В основном я хочу эти результаты:
... Вы получаете идею.
Я думаю, что все зависит от количества зависимостей в коде и числа разработчиков, работающих над одним и тем же кодом одновременно. Если у вас мало разработчиков, работающих над тем же кодом, то вы можете пройти более длительный период времени без «слияния» с кодом из репозитория. Я лично люблю ждать до конца своего развития, пока мне не понадобятся недели, чтобы закончить. Если для завершения требуется несколько недель, следует разделить функциональные возможности на более мелкие части и использовать более инкрементный подход, который позволяет проверять новый код и чаще объединяться.
-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
// Возможно, вы захотите учесть десятичные числа
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
Если вы действительно хотите регулярное выражение, вы можете использовать два в цикле 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
Сначала переверните массив символов, затем добавьте запятые после каждого третьего числа, если только оно не находится непосредственно перед концом строки или перед знаком -. Затем снова переверните массив символов и снова сделайте его строкой.
function add_commas(numStr){
return numStr.split('').reverse().join('').replace(/(\d{3})(?=[^$|^-])/g, "$1,").split('').reverse().join('');
}
Попробуйте что-нибудь вроде этого:
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;
}
Я думаю, вам обязательно придется выполнить несколько проходов, чтобы добиться этого с регулярные выражения. Попробуйте следующее:
Итерация не требуется
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
Кто-то упомянул, что просмотр назад невозможен в Javascript RegExp. Вот отличная страница, на которой объясняется, как использовать поиск (просмотр вперед и назад).