【问题标题】:Javascript numbers concatenate instead of adding but typeof is number not stringJavascript数字连接而不是添加,但typeof是数字而不是字符串
【发布时间】:2014-03-15 03:40:14
【问题描述】:

我是 javaScript 的新手。我正在构建一个计算器here

我已将输入值存储在变量中,以便最终可以操纵结果以根据输入执行计算。现在我只想把所有的值加在一起。

但是,它们不是相加,而是串联。我使用 parseInt 来防止 javascript 将数字视为字符串,而 typeOf 显示它们是数字。

这是我的 javascript:

$(document).ready(function() {

var theTerm = $("#theTerm").val();
var theRate = $("#theRate").val();
var thePrice = $("#thePrice").val();
var theTax = $("#theTax").val();
var theDown = $("#theDown").val();
var theTrade = $("#theTrade").val();
var theResult = parseInt(theTerm + theRate + thePrice + theTax + theDown + theTrade, 10);

$("#calculate").click(function(){
    alert(theResult);
    alert(typeof(theResult));
});

}); 

和 HTML:

<div id="calculator">
<span id="calculatorHeader">Monthly Payment Calculator</span>
<table style="margin:0 auto;">
    <tr>
    <td style="width:40px;">Term
        <input id="theTerm" size="5" value="7" name="term" style="width:35px" />
    </td>
    <td style="width:40px;">Rate(%)
        <input id="theRate" size="5" value="7" name="apr" style="width:35px" />
    </td>
    <td style="width:55px;">Price($)
        <input id="thePrice" size="6" maxlength="7" name="price" style="width:50px" value="7" />
    </td>
    <td style="width:40px;">Tax(%)
        <input id="theTax" size="4" maxlength="7" name="tax" style="width:35px" value="7" />
    </td>
    <td style="width:40px;">Down($)
        <input id="theDown" size="5" maxlength="7" name="downPmt" style="width:35px" value="7" />
    </td>
    <td style="width:40px;">Trade($)
        <input id="theTrade" size="5" maxlength="7" name="trade" style="width:35px" value="7" />
    </td>
    <td style="width:78px;">Est.Monthly Pmt
        <input id="theResult" size="7" maxlength="7" name="result" style="width:75px" value="0" />
    </td>
    </tr>
</table>
<button type="button" id="calculate">Add Boxes!</button>
</div>

【问题讨论】:

  • 每个号码上使用parseInt,然后将它们相加。
  • parseInt 不是一个环境,它会导致其中的所有内容都被视为数字。它是一个接受字符串并返回整数的函数。你有几个字符串;去获取几个整数。
  • 您缺少的是.val() 返回用户键入的内容,即string。当你添加字符串时,你会得到另一个字符串。如果你加上“13”+“26”,你会得到“1326”,而不是39。
  • @jfriend00 我通过使用 typeOf 弄清楚了这一点,用谷歌搜索了要做什么,然后在我的原始帖子中使用了代码(使用 parseInt)。奇怪的是 typeOf 然后返回“数字”但仍然连接结果,就好像它是一个字符串!
  • 您添加了字符串,然后转换为数字。在添加之前,您必须转换为数字。

标签: javascript jquery


【解决方案1】:

更改行并将 parseInt 应用到每个 obj 如下

var theResult = parseInt(theTerm) + parseInt(theRate) + parseInt(thePrice) + parseInt(theTax) + parseInt(theDown) + parseInt(theTrade);

【讨论】:

  • 这确实有效,但我不想每次需要变量时都使用 parseInt。这是唯一的方法吗?
  • yupp 有必要将字符串转换为整数值,您也可以尝试@mohit pandey 的答案将字符串转换为 int。
  • @HelloWorld 不用每次都用,重复一遍,see my answer
  • 你真的应该使用10作为parseInt函数的第二个参数
  • 现在你可以使用var theResult = [theTerm, theRate, thePrice, theTax, theDown, theTrade].reduce((a, b) =&gt; a + Number(b), 0);
【解决方案2】:

您可以将数字乘以1,而不是使用parseInt。它是一种更快、更简单的数据类型转换方法。

$(document).ready(function () {
    var theTerm = $("#theTerm").val() * 1;
    var theRate = $("#theRate").val() * 1;
    var thePrice = $("#thePrice").val() * 1;
    var theTax = $("#theTax").val() * 1;
    var theDown = $("#theDown").val() * 1;
    var theTrade = $("#theTrade").val() * 1;
    var theResult = theTerm + theRate + thePrice + theTax + theDown + theTrade;

    $("#calculate").click(function () {
        alert(theResult);
        alert(typeof (theResult));
    });
});

JSFiddle:http://jsfiddle.net/RqzPk/14/

【讨论】:

  • 如果您想要快速紧凑,那么只需在其中添加一个+var theTerm = +$("#theTerm").val()。就个人而言,我不认为这些“技巧”转换像显式数字转换那样可读(容易错过开发人员的意图)。
  • @jfriend00 这两个也可以。根据具体情况,我可以看到这些方法在哪里有用。
【解决方案3】:

稍微整理一下你的代码,避免重复:

DEMO

$(document).ready(function() {
    $("#calculate").click(function(){   
        var inputs = $("input"), theResult = 0;  // `inputs` is the list of all input elements

        for(var i = 0;i < inputs.length; i++)  // iterate over all inputs
            // parse their value, in base 10, and add to the theResult
            theResult += parseInt(inputs[i].value, 10); 

        alert(theResult); // 42
    });
});

【讨论】:

  • 为了做简单的加法,这是最优的。但是,正如我在问题中所述,这将是一个计算器,它执行的功能不仅仅是在字段中添加数字。当我想在总数中乘以或增加一个百分比时,我不确定您的解决方案是否有效。
  • @HelloWorld 好的,我知道您不会只执行加法。那就道歉吧。
  • @HelloWorld你可能对parseFloat感兴趣,因为如果用户输入十进制值,比如2.2,那么如果你使用parseInt,它就会变成2
  • 好的,明白了! parseInt 将数据类型转换为整数。 parseFloat 将数据类型转换为浮点数。
【解决方案4】:

你必须使用java脚本的parseInt函数。

例如:var theTerm = parseInt($("#theTerm").val());

demo

【讨论】:

  • 我确实使用了 parseInt。您确实需要添加 base # 参数,不是吗?
【解决方案5】:

您将字符串与 + 连接起来,然后将连接后的结果转换为 int。

您希望在添加之前 转换为整数。比如:

var theTerm = parseInt($("#theTerm").val(), 10);
...
var theResult = theTerm + theRate + thePrice + theTax + theDown + theTrade;

【讨论】:

  • 只是为了解释你的答案...... ParseInt 中的第二个参数是要求数字的基数。所以基数 10 将是一个由 0-9 组成的数字。 Base 16 将是十六进制,其中数字将由 0-F 表示。
  • 好的!现在我不必每次在构建时都需要变量时使用 parseInt。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多