Agregar dos números los concatena en lugar de calcular la suma

185

Estoy agregando dos números, pero no obtengo un valor correcto.

Por ejemplo, hacer 1 + 2devuelve 12 y no 3

¿Qué estoy haciendo mal en este código?

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>

okconfused
fuente
¿Qué tipo de valores espera como entrada? ¿Enteros o decimales?
Zorayr
1
Un valor de entrada de texto será una cadena y las cadenas siempre se concatenarán en lugar de
sumarse
1
Una buena reseña sobre la conversión está en esta respuesta .
akTed
1
Posible duplicado de ¿Cómo agregar dos cadenas como si fueran números?
Defensor orgánico
Si tiene un <input type="number">, simplemente puede obtener su .valueAsNumberpropiedad directamente.
user4642212

Respuestas:

343

En realidad son cadenas, no números. La forma más fácil de producir un número a partir de una cadena es anteponerlo con +:

var x = +y + +z;
elclanrs
fuente
44
por curiosidad (yo mismo no soy un programador de JavaScript) (y creo que esto mejoraría la respuesta), ¿qué hace el +prefijo con las cadenas?
Sebastian Mach
30
El código anterior es un poco extraño y confundirá a los desarrolladores menos experimentados. El código también fallará JSLint por el uso confuso de '+'.
Zorayr
2
@phresnel: operadores unarios +
akTed
10
@AKTed: En realidad, quería provocar a los elclanrs para que lo describieran un poco en su respuesta. Por supuesto, no puedo hacer la búsqueda en Google yo mismo; pero (imo) mejoraría la calidad de la respuesta, especialmente porque el uso de prefijo + para la conversión de cadenas es bastante poco común en otros lenguajes de programación y puede confundir a los novatos. (Sin embargo, gracias por compartir el enlace)
Sebastian Mach
2
Desalentaría a cualquiera de usar este atajo. Sé que analizar una cadena en un número requiere más código, pero al menos el código claramente coincide con la intención.
Si Kelly
130

Yo solo uso Number():

var i=2;  
var j=3;  
var k = Number(i) + Number(j); // 5  
gerard
fuente
2
Seguí cometiendo este error que siempre concatena: var k += Number(i)
John Phelps
Útil, gracias
Prasad Patel
29

Debe usar el parseInt()método de javaScript para convertir las cadenas de nuevo en números. En este momento son cadenas, por lo que agregar dos cadenas las concatena, por lo que obtienes "12".

mitim
fuente
1
No estoy seguro de que parseInt()sea ​​la mejor opción aquí dado que la función del OP es agregar dos "números" ingresados ​​por el usuario, no dos "enteros".
nnnnnn
2
@nnnnnn Creo que eso podría modificarse fácilmente parseFloatsi el OP proporciona más información.
Yoshi
1
@Yoshi - Sí, sí podría, pero dado que la respuesta en realidad no dice en ningún lugar que parseInt()solo devuelva enteros, y no explica ninguna de parseInt()las "peculiaridades", lo que podría ser un problema con los datos ingresados ​​por el usuario. Pensé que valía la pena mencionarlo. (En realidad no voté en contra ni nada.)
nnnnnn
Sí, supuse que la entrada sería un número entero ya que daban un ejemplo de 1 + 2, pero tienes razón: parseFloat () puede ser mejor si son cualquier 'número'.
mitim
22

Use parseInt (...) pero asegúrese de especificar un valor de raíz; de lo contrario, se encontrará con varios errores (si la cadena comienza con "0", la raíz es octal / 8, etc.).

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

alert(x + y);

¡Espero que esto ayude!

Zorayr
fuente
55
No estoy seguro de que parseInt()sea ​​la mejor opción aquí dado que la función del OP es agregar dos "números" ingresados ​​por el usuario, no dos "enteros".
nnnnnn
1
A menos que esté esperando valores de coma flotante, creo que usar este enfoque todavía funciona muy bien.
Zorayr
1
Esto ya no es un problema en ES6. La raíz se puede omitir de forma segura. parseInt("012")funciona bien, devolviendo 12. Por supuesto, todavía tienes que tener cuidado con cosas como [1,2].map(parseInt).
6

Simplemente agregue un método de conversión de tipo simple ya que la entrada se toma en texto. Use lo siguiente:

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

Lo siguiente puede ser útil en términos generales.

  • Primero, los campos de formulario HTML están limitados a texto . Esto se aplica especialmente a los cuadros de texto, incluso si se ha esforzado para garantizar que el valor se vea como un número.

  • En segundo lugar, JavaScript, para bien o para mal, ha sobrecargado al +operador con dos significados: agrega números y concatena cadenas. Tiene preferencia por la concatenación, por lo que incluso una expresión como 3+'4'se tratará como concatenación.

  • En tercer lugar, JavaScript intentará cambiar los tipos dinámicamente si puede y si es necesario. Por ejemplo '2'*'3', cambiará ambos tipos a números, ya que no puede multiplicar cadenas. Si uno de ellos es incompatible, obtendrá NaNNo es un número.

Su problema ocurre porque los datos que provienen del formulario se consideran una cadena y +, por lo tanto, se concatenarán en lugar de agregarse.

Al leer datos supuestamente numéricos de un formulario, siempre debe pasarlos parseInt()o parseFloat(), dependiendo de si desea un entero o un decimal.

Tenga en cuenta que ninguna función convierte verdaderamente una cadena en un número. En su lugar, analizará la cadena de izquierda a derecha hasta que llegue a un carácter numérico no válido o al final y convierta lo que se ha aceptado. En el caso de parseFloat, eso incluye un punto decimal, pero no dos.

Cualquier cosa después del número válido simplemente se ignora. Fallan si la cadena ni siquiera comienza como un número. Entonces lo conseguirás NaN.

Una buena técnica de propósito general para números de formularios es algo como esto:

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

Si está preparado para fusionar una cadena no válida a 0, puede usar:

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

Sencillo

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

Esto no resumirá el número; en su lugar lo concatenará:

var x = y + z;

Necesitas hacer:

var x = (y)+(z);

Debe usar parseInt para especificar la operación en números. Ejemplo:

var x = parseInt(y) + parseInt(z); [final soulution, as everything us]
Pushp Singh
fuente
Esta debería ser la respuesta correcta additiony subtractionno la aceptada.
MR_AMDEV
3

¡Este código suma las dos variables! Ponlo en tu función

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

Te falta la conversión de tipo durante el paso de adición ...
var x = y + z;debe servar 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
fuente
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
fuente
3
Añadir un poco de explicación con la respuesta de cómo esta respuesta ayuda OP en la fijación de edición actual
ρяσѕρєя K
1

Es muy 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
fuente
1

Prueba esto:

<!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
fuente
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
fuente
3
Bienvenido a SO! ¿Puedes explicar un poco más? Su respuesta es solo código, por lo que podría funcionar, pero el interlocutor (¡u otros visitantes!) Podría no entender por qué funciona.
Chilion
1

Si tenemos dos campos de entrada, obtenga los valores de los campos de entrada y luego agréguelos usando 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
fuente
0

Puede hacer una comprobación previa con expresión regular si son números como

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
fuente
En lugar de expresiones regulares, puede usar parseXX y verificar el retorno de NaN.
Hank
Validar los datos ingresados ​​por el usuario siempre es un buen plan, pero aún necesita convertir las cadenas de entrada a forma numérica antes de poder hacer una suma numérica.
nnnnnn
0

Úselo parseFloatconvertirá una cadena a un número que incluya valores decimales.

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

También puedes escribir: var z = x - -y; Y obtienes la respuesta correcta.

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

Aquí va tu código analizando las variables en la función.

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

Responder

Ingrese la descripción de la imagen aquí

Manoj Krishna
fuente
-2

Una solución alternativa, solo compartir :):

var result=eval(num1)+eval(num2);
usuario3201772
fuente
No es tan bueno como usar el complemento aritmético jQuery , pero me gusta.
Paul Draper