为什么我在尝试舍入(javascript)时获得NaN?

时间:2016-10-04 16:32:41

标签: javascript math rounding

我有这个代码在Chart.JS条形图中添加一个值以上的值:

//ctx.fillText(addCommas(dataset.data[i]), model.x, y_pos);
ctx.fillText(addCommasRound(dataset.data[i]), model.x, y_pos);

旧代码(使用addCommas())有效,将“1838204.79”等值更改为“1,838,204.79”

我想忽略分数/小数,所以我尝试了另一种类似的addCommasRound()方法:

function addCommasRound(nStr) {
    nStr += '';
    x = nStr.split('.');
    x1 = x[0];
    x2 = x.length > 1 ? '.' + x[1] : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1)) {
        x1 = x1.replace(rgx, '$1' + ',' + '$2');
    }
    return Math.round(x1 + x2);
}

addCommas()和addCommasRound()之间的唯一区别是将MathRound()插入到return语句中。为什么这会导致值为“NaN”而不是“1,838,205”?

我也尝试将最后一行更改为:

return Math.round(x1);

...只是为了看它是否会失败,但结果相同(“NaN”)。

3 个答案:

答案 0 :(得分:2)

由于x1x2不是数字(这是NaN代表的数字),因此它们是字符串。

您需要先对数字进行舍入,然后执行字符串操作。

function addCommasRound(nStr) {
    nStr = String(Math.round(Number(nStr)));

另见JavaScript string and number conversion

答案 1 :(得分:2)

数字文字中不允许使用逗号。 Math.round尝试将参数转换为数字。

执行+'1,000'会产生NaN,而+'1000'会产生1000

如果您要为您要返回的号码添加逗号,请先轮回,然后然后添加逗号。

答案 2 :(得分:-1)

根据OrangeDog的回答,我提出了这个工作推导:

function addCommasRound(nStr) {
    nStr = String(Math.round(Number(nStr)));
    x = nStr.split('.');
    x1 = x[0];
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1)) {
        x1 = x1.replace(rgx, '$1' + ',' + '$2');
    }
    return x1;
}