Durch Hinzufügen von zwei Zahlen werden diese verkettet, anstatt die Summe zu berechnen


184

Ich füge zwei Zahlen hinzu, erhalte aber keinen korrekten Wert.

Wenn Sie beispielsweise 1 + 2ausführen, wird 12 und nicht 3 zurückgegeben

Was mache ich in diesem Code falsch?

function myFunction() {
  var y = document.getElementById("txt1").value;
  var z = document.getElementById("txt2").value;
  var x = y + z;
  document.getElementById("demo").innerHTML = x;
}
<p>
  Click the button to calculate x.
  <button onclick="myFunction()">Try it</button>
</p>
<p>
  Enter first number:
  <input type="text" id="txt1" name="text1" value="1">
  Enter second number:
  <input type="text" id="txt2" name="text2" value="2">
</p>
<p id="demo"></p>


Welche Art von Werten erwarten Sie als Eingabe? Ganzzahlen oder Dezimalstellen?
Zorayr

1
Ein Texteingabewert ist eine Zeichenfolge, und Zeichenfolgen werden immer verkettet anstatt
hinzugefügt

1
Eine gute Beschreibung der Konvertierung finden Sie in dieser Antwort .
akTed


Wenn Sie eine haben <input type="number">, können Sie einfach deren .valueAsNumberEigentum direkt erhalten.
user4642212

Antworten:


339

Sie sind eigentlich Zeichenfolgen, keine Zahlen. Der einfachste Weg, eine Zahl aus einer Zeichenfolge zu erstellen, besteht darin, ihr Folgendes voranzustellen +:

var x = +y + +z;

4
Was macht das +-prefix aus Neugier (ich selbst kein JavaScript-Programmierer) (und ich denke, dies würde die Antwort verbessern) mit Strings?
Sebastian Mach

30
Der obige Code ist etwas bizarr und wird weniger erfahrene Entwickler verwirren. Der Code schlägt auch JSLint wegen verwirrender Verwendung von '+' fehl.
Zorayr

2
@phresnel: unary + operator
akTed

10
@AKTed: Eigentlich wollte ich elclanrs provozieren, um es ein bisschen in seiner Antwort zu beschreiben . Natürlich kann ich die Google-Suche nicht selbst durchführen. Aber es würde (imo) die Qualität der Antwort verbessern, insbesondere weil die Verwendung von Präfix- + für die Zeichenfolgenkonvertierung in anderen Programmiersprachen ziemlich ungewöhnlich ist und Neulinge verwirren könnte. (aber danke für das Teilen des Links)
Sebastian Mach

2
Ich würde jeden davon abhalten, diese Verknüpfung zu verwenden. Ich weiß, dass das Parsen einer Zeichenfolge in eine Zahl mehr Code erfordert, aber zumindest der Code eindeutig der Absicht entspricht.
Si Kelly

130

Ich benutze nur Number():

var i=2;  
var j=3;  
var k = Number(i) + Number(j); // 5  

2
Ich habe immer wieder diesen Fehler gemacht, der immer betrifft: var k += Number(i)
John Phelps

Nützlich, danke
Prasad Patel

29

Sie müssen die JavaScript- parseInt()Methode verwenden, um die Zeichenfolgen wieder in Zahlen umzuwandeln . Im Moment handelt es sich um Zeichenfolgen, daher werden sie durch Hinzufügen von zwei Zeichenfolgen verkettet, weshalb Sie "12" erhalten.


1
Ich bin mir nicht sicher, ob dies parseInt()die beste Option ist, da die Funktion des OP zwei vom Benutzer eingegebene "Zahlen" und nicht zwei "Ganzzahlen" hinzufügt.
nnnnnn

2
@nnnnnn Ich denke, das könnte leicht geändert werden, parseFloatwenn das OP mehr Input liefert.
Yoshi

1
@Yoshi - Ja, ja, könnte es, aber da die Antwort eigentlich nirgendwo sagt, dass parseInt()nur ganze Zahlen zurückgegeben werden, und keine der parseInt()"Macken" erklärt - was ein Problem mit vom Benutzer eingegebenen Daten sein könnte - ich dachte, es wäre erwähnenswert. (Ich habe nicht wirklich herabgestimmt oder so.)
nnnnnn

Ja, ich hatte angenommen, dass die Eingabe Ganzzahlen sein würde, da sie ein Beispiel für 1 + 2 gaben, aber Sie haben Recht - parseFloat () ist möglicherweise besser, wenn es sich nur um beliebige 'Zahlen' handelt.
Mitim

22

Verwenden Sie parseInt (...) , stellen Sie jedoch sicher, dass Sie einen Radix-Wert angeben. Andernfalls treten mehrere Fehler auf (wenn die Zeichenfolge mit "0" beginnt, ist der Radix oktal / 8 usw.).

var x = parseInt(stringValueX, 10);
var y = parseInt(stringValueY, 10);

alert(x + y);

Hoffe das hilft!


5
Ich bin mir nicht sicher, ob dies parseInt()die beste Option ist, da die Funktion des OP zwei vom Benutzer eingegebene "Zahlen" und nicht zwei "Ganzzahlen" hinzufügt.
nnnnnn

1
Wenn er keine Gleitkommawerte erwartet, funktioniert dieser Ansatz meiner Meinung nach immer noch hervorragend.
Zorayr

1
Dies ist in ES6 kein Problem mehr. Der Radix kann sicher weggelassen werden. parseInt("012")funktioniert gut und gibt 12 zurück. Natürlich muss man immer noch vorsichtig mit Dingen wie sein [1,2].map(parseInt).

6

Fügen Sie einfach eine einfache Typ-Casting-Methode hinzu, während die Eingabe im Text erfolgt. Verwenden Sie Folgendes:

    var y = parseInt(document.getElementById("txt1").value);
    var z = parseInt(document.getElementById("txt2").value);
    var x = y + z;

6

Das Folgende kann allgemein nützlich sein.

  • Erstens sind HTML-Formularfelder auf Text beschränkt . Dies gilt insbesondere für Textfelder, auch wenn Sie sich bemüht haben, sicherzustellen, dass der Wert wie eine Zahl aussieht .

  • Zweitens hat JavaScript den +Operator mit zwei Bedeutungen überladen : Es fügt Zahlen hinzu und verkettet Zeichenfolgen. Es hat eine Präferenz für Verkettung, so dass selbst ein Ausdruck wie 3+'4'als Verkettung behandelt wird.

  • Drittens wird JavaScript versuchen, Typen dynamisch zu ändern, wenn dies möglich ist und erforderlich ist. Beispielsweise '2'*'3'werden beide Typen in Zahlen geändert, da Sie Zeichenfolgen nicht multiplizieren können. Wenn einer von ihnen nicht kompatibel ist, erhalten Sie NaNkeine Nummer.

Ihr Problem tritt auf, weil die aus dem Formular stammenden Daten als Zeichenfolge betrachtet werden und +daher eher verkettet als hinzugefügt werden.

Wenn Sie vermeintlich numerische Daten aus einem Formular lesen, sollten Sie diese immer durch parseInt()oder drücken parseFloat(), je nachdem, ob Sie eine Ganzzahl oder eine Dezimalzahl wünschen.

Beachten Sie, dass keine der beiden Funktionen eine Zeichenfolge wirklich in eine Zahl konvertiert . Stattdessen wird die Zeichenfolge von links nach rechts analysiert, bis ein ungültiges numerisches Zeichen oder das Ende erreicht ist, und das Akzeptierte konvertiert. Im Fall von parseFloatumfasst dies einen Dezimalpunkt, aber nicht zwei.

Alles nach der gültigen Nummer wird einfach ignoriert. Sie schlagen fehl, wenn die Zeichenfolge nicht einmal als Zahl beginnt. Dann wirst du bekommen NaN.

Eine gute Allzwecktechnik für Zahlen aus Formularen ist ungefähr so:

var data=parseInt(form.elements['data'].value); //  or parseFloat

Wenn Sie bereit sind, eine ungültige Zeichenfolge auf 0 zusammenzuführen, können Sie Folgendes verwenden:

var data=parseInt(form.elements['data'].value) || 0;


4

Dies wird die Zahl nicht zusammenfassen; stattdessen wird es verkettet:

var x = y + z;

Sie müssen tun:

var x = (y)+(z);

Sie müssen parseInt verwenden, um die Operation für Zahlen anzugeben. Beispiel:

var x = parseInt(y) + parseInt(z); [final soulution, as everything us]

Dies sollte die richtige Antwort sein additionund subtractionnicht die akzeptierte.
MR_AMDEV

3

Dieser Code summiert beide Variablen! Setzen Sie es in Ihre Funktion ein

var y = parseInt(document.getElementById("txt1").value);
var z = parseInt(document.getElementById("txt2").value);
var x = (y +z);
document.getElementById("demo").innerHTML = x;`

1

Sie vermissen die Typkonvertierung während des Additionsschritts ...
var x = y + z;sollte seinvar x = parseInt(y) + parseInt(z);

 <!DOCTYPE html>

 <html>
 <body>
  <p>Click the button to calculate x.</p>
  <button onclick="myFunction()">Try it</button>
  <br/>
  <br/>Enter first number:
  <input type="text" id="txt1" name="text1">Enter second number:
  <input type="text" id="txt2" name="text2">
  <p id="demo"></p>
 <script>
    function myFunction() 
    {
      var y = document.getElementById("txt1").value;
      var z = document.getElementById("txt2").value;
      var x = parseInt(y) + parseInt(z);
      document.getElementById("demo").innerHTML = x;
    }
 </script>
 </body>
 </html>

1
  <input type="text" name="num1" id="num1" onkeyup="sum()">
  <input type="text" name="num2" id="num2" onkeyup="sum()">
  <input type="text" name="num2" id="result">

  <script>
     function sum()
     {

        var number1 = document.getElementById('num1').value;
        var number2 = document.getElementById('num2').value;

        if (number1 == '') {
           number1 = 0
           var num3 = parseInt(number1) + parseInt(number2);
           document.getElementById('result').value = num3;
        }
        else if(number2 == '')
        {
           number2 = 0;
           var num3 = parseInt(number1) + parseInt(number2);
           document.getElementById('result').value = num3;
        }
        else
        {
           var num3 = parseInt(number1) + parseInt(number2);
           document.getElementById('result').value = num3;
        }

     }
  </script>

3
Fügen Sie eine Erklärung mit Antwort hinzu, wie diese Antwort OP bei der Behebung des aktuellen Problems
hilft

1

Es ist sehr einfach:

<html>

    <body>
        <p>Click the button to calculate x.</p>
        <button onclick="myFunction()">Try it</button>
        <br/>
        <br/>Enter first number:
        <input type="text" id="txt1" name="text1">Enter second number:
        <input type="text" id="txt2" name="text2">
        <p id="demo"></p>

        <script>
            function myFunction() {
                var y = document.getElementById("txt1").value;
                var z = document.getElementById("txt2").value;
                var x = +y + +z;
                document.getElementById("demo").innerHTML = x;
            }
        </script>
    </body>
</html>

1

Versuche dies:

<!DOCTYPE html>
<html>

    <body>
        <p>Add Section</p>

        <label>First Number:</label>
        <input id="txt1"  type="text"/><br />
        <label>Second Number:</label>
        <input id="txt2"  type="text"/><br />

        <input type="button" name="Add" value="Add" onclick="addTwoNumber()"/>
        <p id="demo"></p>

        <script>
            function myFunction() {
                document.getElementById("demo").innerHTML = Date();
            }

            function addTwoNumber(){
                var a = document.getElementById("txt1").value;
                var b = document.getElementById("txt2").value;

                var x = Number(a) + Number(b);
                document.getElementById("demo").innerHTML = "Add Value: " + x;
            }
        </script>
    </body>
</html>

1
    <head>
        <script type="text/javascript">
            function addition()
            {
                var a = parseInt(form.input1.value);
                var b = parseInt(form.input2.value);
                var c = a+b
                document.write(c);
            }
        </script>
    </head>

    <body>
        <form name="form" method="GET">
        <input type="text" name="input1" value=20><br>
        <input type="text" name="input2" value=10><br>
        <input type="button" value="ADD" onclick="addition()">
        </form>
    </body>
</html>

3
Willkommen bei SO! Können Sie bitte etwas mehr erklären? Ihre Antwort ist nur Code, also könnte es funktionieren, aber der Fragesteller (oder andere Besucher!) Verstehen möglicherweise nicht, warum es funktioniert.
Chilion

1

Wenn wir zwei Eingabefelder haben, rufen Sie die Werte aus den Eingabefeldern ab und fügen Sie sie mit JavaScript hinzu.

$('input[name="yourname"]').keyup(function(event) {
    /* Act on the event */
    var value1 = $(this).val();
    var value2 = $('input[name="secondName"]').val();
    var roundofa = +value2+ +value1;

    $('input[name="total"]').val(addition);
});

0

Sie können eine Vorprüfung mit regulären Ausdrücken durchführen, unabhängig davon, ob es sich um Zahlen handelt

function myFunction() {
    var y = document.getElementById("txt1").value;
    var z = document.getElementById("txt2").value;
    if((x.search(/[^0-9]/g) != -1)&&(y.search(/[^0-9]/g) != -1))
      var x = Number(y)+ Number(z);
    else
      alert("invalid values....");
    document.getElementById("demo").innerHTML = x;
  }

Anstelle von regulären Ausdrücken können Sie auch parseXX verwenden und nach NaN-Rückgabe suchen.
Hank

Das Überprüfen von vom Benutzer eingegebenen Daten ist immer ein guter Plan, aber Sie müssen die Eingabezeichenfolgen noch in eine numerische Form konvertieren, bevor Sie eine numerische Addition durchführen können.
nnnnnn

0

Mit parseFloatdieser Option wird die Zeichenfolge in eine Zahl mit Dezimalwerten konvertiert.

 function myFunction() {
      var y = document.getElementById("txt1").value;
      var z = document.getElementById("txt2").value;
      var x = parseFloat(y) + parseFloat(z);
      document.getElementById("demo").innerHTML = x;
    }


<p>
  Click the button to calculate x.
  <button onclick="myFunction()">Try it</button>
</p>
<p>
  Enter first number:
  <input type="text" id="txt1" name="text1" value="1">
  Enter second number:
  <input type="text" id="txt2" name="text2" value="2">
</p>
<p id="demo"></p>

0

Sie können auch schreiben: var z = x - -y; Und du bekommst die richtige Antwort.

<body>

<input type="text" id="number1" name="">
<input type="text" id="number2" name="">
<button type="button" onclick="myFunction()">Submit</button>

<p id="demo"></p>

    <script>
    function myFunction() {
        var x, y ;

        x = document.getElementById('number1').value;
        y = document.getElementById('number2').value;

        var z = x - -y ;

        document.getElementById('demo').innerHTML = z;
    }
    </script>
</body>

0

Hier geht Ihr Code durch Parsen der Variablen in der Funktion.

<html>
  <body>
    <p>Click the button to calculate x.</p>
    <button onclick="myFunction()">Try it</button>
    <br/>
    <br/>Enter first number:
    <input type="text" id="txt1" name="text1">
    <br>Enter second number:
    <input type="text" id="txt2" name="text2">
    <p id="demo"></p>
    <script>
      function myFunction() {
        var y = parseInt(document.getElementById("txt1").value);
        var z = parseInt(document.getElementById("txt2").value);
        var x = y + z;
        document.getElementById("demo").innerHTML = x;
      }
    </script>
  </body>
</html>

Antworten

Geben Sie hier die Bildbeschreibung ein


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.