Javascript数字格式化异常

Javascript数字格式化异常,javascript,html,dom,Javascript,Html,Dom,我在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=forma

我在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);

它的工作正常,除了总数1787.78。在图中,您可以看到它完美地格式化了total 1249.69,regexp上的
g
标志告诉regexp引擎多次匹配模式并替换每个实例。因为您的数字不是1787.78,而是1787.780000000002,所以模式将在3个连续数字前面的每个数字后面匹配,后面将放置一个逗号

要避免这种情况,但仍要使正则表达式在长数字上多次匹配,有两种方法:

  • 调整正则表达式,使其不匹配任何前一个句点的内容(但由于这需要lookbehinds,因此它相当昂贵且难看,我不推荐使用)

  • 将数字四舍五入到小数点后2位

这应该起作用:

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

不要使用
num.toString()
,而是尝试
num.toFixed(2)
Yes,它可以在Brave中工作,可能在Chrome中工作。但在FF中,我得到了这样一句话:“SyntaxError:invalid regexp group”。不熟悉FF控制台,但它指向techSummary.js 1:3。我知道techSummary在哪里,但我不知道1:3指的是什么。我习惯于在Chrome中返回一个行号。
1:3
的意思是“第1行,第3列”,也就是“第一行的第3个字符”。谢谢,Johannes H。如果我按字面理解FF,那么它就是函数中的“n”,即“函数makeReport(sdate,edate){”。我尝试了一些补救措施,在表达式中放置插入符号,这确实消除了错误,但也破坏了函数的作用,即格式化数字。抱歉,请阅读此内容。但是如果FF抱怨regexp,那么行:列编号可能指的是regexp-w中的位置这将是
\d
中的
\
,这将暗示FF不知道
\d
。然而,我几乎无法想象。因此更可能是
$1,
中的
,FF正在解析
1,
作为捕获组的名称,这确实是无效的。非常好。FF不喜欢正则表达式。请参阅上面的评论。但对于Chrome或Brave或其他Chrome变体,请检查是否关闭。
function formatNumber(num) {
    return num.toFixed(2).toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,')
}