在数组中添加整数的问题

时间:2010-05-28 19:02:58

标签: javascript jquery

我正在尝试遍历我的总计,以获得我的网络应用程序的总计。到目前为止,我正在使用的代码如下:

function calcAllFields() {
    var name = parseFloat($('div [name = total[]]').text());
    var totArray = $.makeArray(name);
    var total = 0;
        for (var i = 0; i < totArray.length; i++) {
                total += totArray[i];
                }
    $("#target1").text(total);
}

不是添加整数,而是将某些内容作为字符串读取。说我要加200 + 50,而不是250我得到20050.谁能指出我做错了什么?谢谢!

5 个答案:

答案 0 :(得分:6)

使用parseInt确保您没有连接字符串。

E.g:

total += parseInt(totArray[i], 10);

答案 1 :(得分:2)

您可以cast to a number使用+Number()

(+"200") + (+"50")              //-> 250
Number("200") + Number("50")    //-> 250

total += +totArray[i]; 

就个人而言,我更喜欢在许多情况下使用+而不是parseInt / parseFloat,因为只要字符串以数字开头,这些函数就会返回一个数字,例如1,000将解析为1. +“1,000”将返回NaN,这是更理想的IMO。您也不必担心基数,因为+“010”不会被视为八进制。

答案 2 :(得分:2)

div[name=total[]]可能包含多个元素,因此可能会导致一些奇怪的行为。试试这个:

function calcAllFields() {
    var total = 0;
    $('div[name=total[]]').each(function() {
        total += parseFloat($(this).text());
    }
    $("#target1").text(total);
}

答案 3 :(得分:1)

你尝试过吗?

total+= parseInt(totArray[i]);

答案 4 :(得分:0)

我很惊讶你已经到了20050。代码应该根本不起作用。

$('div [name = total[]]')

首先,这不是一个有效的选择器。您必须转义或引用属性选择器,否则其中的第一个]将关闭选择器,留下无效的尾随秒]

它只是起作用,因为jQuery / Sizzle中的选择器解析中有一个怪癖(bug)。但是因为它是非标准的,(a)它可能在未来中断,并且(b)它不会利用现代浏览器中的快速原生querySelectorAll。更好:

$('div [name="total[]"]')

然而,你需要jQuery 1.4,因为jQuery 1.3的属性选择器解析更加错误并打破了这种情况。

最好避免所有这些问题,只需为这些元素分配一个class,然后再选择它。

$('div [name = total[]]').text()

div中有name="total[]"的元素是什么?我认为它们是某种形式控件,否则name属性将无效。但text()不是阅读表单控件的正确方法。它为您提供元素标签内的文本内容,而不是字段的当前值。

<input>没有文字内容。 <textarea>确实有文字内容,但不一定与字段的值相同。文本内容(如value的{​​{1}}属性)是字段的默认值,而不是当前值。您应该使用<input>来读取当前值。

val()

这没用。通过调用选择器包装器对象上的var totArray = $.makeArray(name); ,您已经丢弃了那里的多个元素,将它们转换为一个文本字符串。你不能从字符串中取回它们。所有text()都会给你一个包含该单个字符串作为项目的数组。

您需要做的是分别依次读取每个输入的值,以便将它们一起添加。

makeArray

(根据Andy的回答,var total= 0; $('div [name="total[]"]').each(function() { total+= +$(this).val(); }); $("#target1").text(total); 将值字符串转换为整数。)