Javascript аномолия форматирования чисел - PullRequest
0 голосов
/ 01 мая 2020

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

lth=appl.length+3;
var table = $("#unitsCompleted")[0];
var sum=0;
for(i=0; i<temp.length; i++){
    sum += Number(table.rows[lth].cells[i+1].innerHTML);
}
var t=formatNumber(sum);            
$("#mtf_retail").html("$ "+t);

Идентичный код используется в нескольких других местах. На самом деле был просто скопирован. Ниже приведена функция форматирования:

function formatNumber(num) {
    return num.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,')
}

Работает нормально за исключением 1787,78. На изображении видно, что он отлично отформатировал итого 1 249,69 enter image description here

1 Ответ

1 голос
/ 01 мая 2020

флаг g на вашем регулярном выражении говорит механизму регулярного выражения, что он должен соответствовать шаблону несколько раз и заменять каждый экземпляр. Поскольку ваш номер не 1787.78, а 1787.7800000000002, шаблон будет совпадать после каждого числа перед 3 последовательными цифрами, а запятая будет помещена позже.

Чтобы избежать этого, но при этом совпадение с регулярным выражением все равно Несколько раз для длинных чисел, есть два способа:

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

  • округлить число до 2 десятичных знаков

Это должно работать:

function formatNumber(num) {
    return num.toFixed(2).toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,')
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...