Ajouter deux nombres les concatène au lieu de calculer la somme

185

J'ajoute deux nombres, mais je n'obtiens pas une valeur correcte.

Par exemple, faire 1 + 2renvoie 12 et non 3

Qu'est-ce que je fais mal dans ce code?

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>

okconfus
la source
Quel type de valeurs attendez-vous en entrée? Entiers ou décimales?
Zorayr
1
Une valeur d'entrée de texte sera une chaîne et les chaînes seront toujours concaténées au lieu d'être ajoutées
merci
1
Une bonne description de la conversion se trouve dans cette réponse .
akTed le
Si vous avez un <input type="number">, vous pouvez simplement obtenir sa .valueAsNumberpropriété directement.
user4642212

Réponses:

343

Ce sont en fait des chaînes, pas des nombres. Le moyen le plus simple de produire un nombre à partir d'une chaîne est de le faire précéder de +:

var x = +y + +z;
elclans
la source
4
par curiosité (moi-même pas un programmeur JavaScript) (et je pense que cela améliorerait la réponse), que fait le +-prefix avec les chaînes?
Sebastian Mach
30
Le code ci-dessus est un peu bizarre et déroutera les développeurs moins expérimentés. Le code échouera également JSLint pour une utilisation confuse de «+».
Zorayr
2
@phresnel: unary + operators
akTed
10
@AKTed: En fait, je voulais provoquer elclanrs pour le décrire un peu dans sa réponse. Bien entendu, je ne suis pas en mesure d'effectuer moi-même la recherche sur Google; mais cela améliorerait (imo) la qualité de la réponse, en particulier parce que l'utilisation du préfixe + pour la conversion de chaînes est assez rare dans d'autres langages de programmation et pourrait dérouter les débutants. (cependant, merci d'avoir partagé le lien)
Sebastian Mach
2
Je découragerais quiconque d'utiliser ce raccourci. Je sais que l'analyse d'une chaîne en un nombre nécessite plus de code, mais au moins le code correspond clairement à l'intention.
Si Kelly
130

J'utilise juste Number():

var i=2;  
var j=3;  
var k = Number(i) + Number(j); // 5  
Gérard
la source
2
J'ai continué à faire cette erreur qui concate toujours: var k += Number(i)
John Phelps
Utile, Merci
Prasad Patel
29

Vous devez utiliser la parseInt()méthode de javaScript pour transformer les chaînes en nombres. À l'heure actuelle, ce sont des chaînes, donc ajouter deux chaînes les concatène, c'est pourquoi vous obtenez "12".

mitim
la source
1
Je ne suis pas sûr que ce parseInt()soit la meilleure option ici étant donné que la fonction de l'OP est d'ajouter deux "nombres" saisis par l'utilisateur, pas deux "entiers".
nnnnnn
2
@nnnnnn Je pense que cela pourrait facilement être modifié parseFloatsi le PO fournissait plus d'informations.
Yoshi
1
@Yoshi - Oui, oui, mais étant donné que la réponse ne dit en fait nulle part qui parseInt()ne renvoie que des entiers, et n'explique aucune des parseInt()"bizarreries" de - ce qui pourrait être un problème avec les données saisies par l'utilisateur - je pensait que cela valait la peine d'être mentionné. (Je n'ai pas vraiment voté contre ou quoi que ce soit.)
nnnnnn
Oui, j'avais fait l'hypothèse que l'entrée serait des entiers puisqu'ils ont donné un exemple de 1 + 2, mais vous avez raison - parseFloat () peut être mieux s'il ne s'agit que de n'importe quels «nombres».
mitim le
22

Utilisez parseInt (...) mais assurez-vous de spécifier une valeur de base; sinon vous rencontrerez plusieurs bogues (si la chaîne commence par "0", la base est octal / 8 etc.).

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

alert(x + y);

J'espère que cela t'aides!

Zorayr
la source
5
Je ne suis pas sûr que ce parseInt()soit la meilleure option ici étant donné que la fonction de l'OP est d'ajouter deux "nombres" saisis par l'utilisateur, pas deux "entiers".
nnnnnn
1
À moins qu'il n'attende des valeurs en virgule flottante, je pense que l'utilisation de cette approche fonctionne toujours très bien.
Zorayr
1
Ce n'est plus un problème dans ES6. La base peut être omise en toute sécurité. parseInt("012")fonctionne bien, retourne 12. Bien sûr, vous devez toujours faire attention avec des choses comme [1,2].map(parseInt).
6

Ajoutez simplement une méthode de conversion de type simple car l'entrée est prise dans le texte. Utilisez le suivant:

    var y = parseInt(document.getElementById("txt1").value);
    var z = parseInt(document.getElementById("txt2").value);
    var x = y + z;
Vibhav Shreshth
la source
6

Ce qui suit peut être utile en termes généraux.

  • Premièrement, les champs de formulaire HTML sont limités au texte . Cela s'applique particulièrement aux zones de texte, même si vous avez pris soin de vous assurer que la valeur ressemble à un nombre.

  • Deuxièmement, JavaScript, pour le meilleur ou pour le pire, a surchargé l' +opérateur avec deux significations: il ajoute des nombres et il concatène des chaînes. Il a une préférence pour la concaténation, donc même une expression comme 3+'4'sera traitée comme une concaténation.

  • Troisièmement, JavaScript tentera de changer les types de manière dynamique s'il le peut et s'il le faut. Par exemple '2'*'3', changera les deux types en nombres, car vous ne pouvez pas multiplier les chaînes. Si l'un d'eux est incompatible, vous obtiendrez NaN, Pas un nombre.

Votre problème se produit car les données provenant du formulaire sont considérées comme une chaîne et le +sera donc concaténer plutôt que d'ajouter.

Lors de la lecture de données supposées numériques à partir d'un formulaire, vous devez toujours les pousser à travers parseInt()ou parseFloat(), selon que vous voulez un entier ou un décimal.

Notez qu'aucune fonction ne convertit vraiment une chaîne en nombre. Au lieu de cela, il analysera la chaîne de gauche à droite jusqu'à ce qu'elle atteigne un caractère numérique invalide ou jusqu'à la fin et convertira ce qui a été accepté. Dans le cas de parseFloat, cela inclut un point décimal, mais pas deux.

Tout ce qui suit le numéro valide est simplement ignoré. Ils échouent si la chaîne ne commence même pas par un nombre. Ensuite, vous obtiendrez NaN.

Une bonne technique à usage général pour les nombres à partir de formulaires est quelque chose comme ceci:

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

Si vous êtes prêt à fusionner une chaîne non valide à 0, vous pouvez utiliser:

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

Facile

var result = parseInt("1") + parseInt("2");
console.log(result ); // Outputs 3
Murtaza Khursheed Hussain
la source
4

Cela ne résumera pas le nombre; à la place, il le concaténera:

var x = y + z;

Tu as besoin de faire:

var x = (y)+(z);

Vous devez utiliser parseInt pour spécifier l'opération sur les nombres. Exemple:

var x = parseInt(y) + parseInt(z); [final soulution, as everything us]
Pushp Singh
la source
Cela devrait être la bonne réponse additionet subtractionnon la réponse acceptée.
MR_AMDEV
3

Ce code fait la somme des deux variables! Mettez-le dans votre fonction

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

Il vous manque la conversion de type lors de l'étape d'ajout ...
var x = y + z;devrait êtrevar 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>
Sharjeel
la source
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>
Ahmad Ajaj
la source
3
Ajoutez une explication avec une réponse pour savoir comment cette réponse aide OP à résoudre le problème actuel
ρяσѕρєя K
1

C'est très simple:

<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>
Peter Mortensen
la source
1

Essaye ça:

<!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>
Mohammed Ebrahim
la source
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>
Lakshmi
la source
3
Bienvenue à SO! Pouvez-vous expliquer un peu plus? Votre réponse n'est que du code, donc cela pourrait fonctionner, mais le questionneur (ou d'autres visiteurs!) Pourrait ne pas comprendre pourquoi cela fonctionne.
Chilion
1

Si nous avons deux champs d'entrée, récupérez les valeurs des champs d'entrée, puis ajoutez-les à l'aide de JavaScript.

$('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);
});
Asad Ali
la source
0

Vous pouvez faire une pré-vérification avec une expression régulière si ce sont des nombres comme

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;
  }
RAM
la source
Au lieu d'expressions régulières, vous pouvez simplement utiliser parseXX et vérifier le retour NaN.
écheveau le
La validation des données saisies par l'utilisateur est toujours un bon plan, mais vous devez toujours convertir les chaînes d'entrée sous forme numérique avant de pouvoir effectuer une addition numérique.
nnnnnn
0

Utilisez- parseFloatle pour convertir la chaîne en nombre, y compris les valeurs décimales.

 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>
Poorna Rao
la source
0

Vous pouvez également écrire: var z = x - -y; Et vous obtenez la bonne réponse.

<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>
PA010
la source
0

Voici votre code en analysant les variables de la fonction.

<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>

Répondre

Entrez la description de l'image ici

Manoj Krishna
la source
-2

Une solution alternative, juste partager :):

var result=eval(num1)+eval(num2);
user3201772
la source
Pas sympa que d'utiliser le plugin arithmétique jQuery , mais je l'aime bien.
Paul Draper