L'aggiunta di due numeri li concatena invece di calcolare la somma


185

Sto aggiungendo due numeri, ma non ottengo un valore corretto.

Ad esempio, facendo 1 + 2restituisce 12 e non 3

Cosa sto facendo di sbagliato in questo codice?

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>


Che tipo di valori ti aspetti come input? Numeri interi o decimali?
Zorayr,

1
Un valore di input di testo sarà stringa e le stringhe saranno sempre concatenate anziché addizione
hank

1
Un buon articolo sulla conversione è in questa risposta .
Akted


Se ne hai uno <input type="number">, puoi semplicemente ottenere .valueAsNumberdirettamente la sua proprietà.
user4642212

Risposte:


343

In realtà sono stringhe, non numeri. Il modo più semplice per produrre un numero da una stringa è anteporre con +:

var x = +y + +z;

4
per curiosità (io stesso non un programmatore JavaScript) (e penso che questo migliorerebbe la risposta), cosa fa il +prefisso con le stringhe?
Sebastian Mach,

30
Il codice sopra è un po 'bizzarro e confonderà gli sviluppatori meno esperti. Il codice fallirà anche JSLint per l'uso confuso di '+'.
Zorayr,

2
@phresnel: unary + operatori
Akted

10
@AKTed: In realtà volevo provocare elclanrs per descriverlo un po ' nella sua risposta. Ovviamente non sono in grado di eseguire da solo la ricerca su Google; ma migliorerebbe (imo) la qualità della risposta, soprattutto perché l'uso del prefisso + per la conversione di stringhe è abbastanza raro in altri linguaggi di programmazione e potrebbe confondere i neofiti. (tuttavia, grazie per aver condiviso il link)
Sebastian Mach

2
Scoraggerei chiunque dall'utilizzare questa scorciatoia. So che analizzare effettivamente una stringa in un numero richiede più codice ma almeno il codice corrisponde chiaramente all'intenzione.
Si Kelly,

130

Io uso solo Number():

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

2
Continuavo a commettere questo errore che concede sempre: var k += Number(i)
John Phelps,

Utile, grazie
Prasad Patel il

29

È necessario utilizzare il parseInt()metodo javaScript per convertire le stringhe in numeri. In questo momento sono stringhe, quindi l'aggiunta di due stringhe le concatena, motivo per cui ottieni "12".


1
Non sono sicuro che parseInt()sia l'opzione migliore qui dato che la funzione del PO sta aggiungendo due "numeri" immessi dall'utente, non due "numeri interi".
nnnnnn,

2
@nnnnnn Penso che potrebbe essere facilmente modificato con parseFloatl'OP se fornisse ulteriori input.
Yoshi,

1
@Yoshi - Sì, sì, potrebbe, ma dato che la risposta in realtà non dice da nessuna parte che parseInt()restituisce solo numeri interi e non spiega nessuno dei parseInt()"capricci" - che potrebbe essere un problema con i dati inseriti dall'utente - I ho pensato che valesse la pena menzionarlo. (In realtà non ho votato per nulla o altro.)
nnnnnn,

Sì, avevo ipotizzato che l'input fosse un numero intero poiché hanno fornito un esempio di 1 + 2, ma hai ragione - parseFloat () potrebbe essere migliore se sono solo dei "numeri".
mitim

22

Usa parseInt (...) ma assicurati di specificare un valore radix; altrimenti incontrerai diversi bug (se la stringa inizia con "0", la radice è ottale / 8 ecc.).

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

alert(x + y);

Spero che questo ti aiuti!


5
Non sono sicuro che parseInt()sia l'opzione migliore qui dato che la funzione del PO sta aggiungendo due "numeri" immessi dall'utente, non due "numeri interi".
nnnnnn,

1
A meno che non si aspetti valori in virgola mobile, penso che l'utilizzo di questo approccio funzioni ancora alla grande.
Zorayr,

1
Questo non è più un problema in ES6. Il radix può essere tranquillamente omesso. parseInt("012")funziona bene, restituendo 12. Naturalmente, devi ancora fare attenzione a cose come [1,2].map(parseInt).

6

Basta aggiungere un metodo di fusione di tipo semplice mentre l'input è preso nel testo. Utilizza il seguente:

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

6

Quanto segue può essere utile in termini generali.

  • Innanzitutto, i campi del modulo HTML sono limitati al testo . Ciò vale soprattutto per le caselle di testo, anche se hai fatto tutto il possibile per assicurarti che il valore appaia come un numero.

  • In secondo luogo, JavaScript, nel bene e nel male, ha sovraccaricato l' +operatore con due significati: aggiunge numeri e concatena le stringhe. Ha una preferenza per la concatenazione, quindi anche un'espressione simile 3+'4'verrà trattata come concatenazione.

  • In terzo luogo, JavaScript tenterà di modificare i tipi in modo dinamico, se possibile e se necessario. Ad esempio '2'*'3', entrambi i tipi cambieranno in numeri, poiché non è possibile moltiplicare le stringhe. Se uno di questi è incompatibile, otterrai NaN, Non un numero.

Il problema si verifica perché i dati provenienti dal modulo vengono considerati come una stringa e +pertanto la volontà si concatenerà anziché aggiungere.

Quando leggi i dati apparentemente numerici da un modulo, dovresti sempre passarli attraverso parseInt()o parseFloat(), a seconda che tu voglia un numero intero o un decimale.

Si noti che nessuna delle due funzioni converte veramente una stringa in un numero. Invece, analizzerà la stringa da sinistra a destra fino a quando non raggiungerà un carattere numerico non valido o alla fine e convertirà ciò che è stato accettato. Nel caso di parseFloat, ciò include un punto decimale, ma non due.

Qualsiasi cosa dopo il numero valido viene semplicemente ignorata. Falliscono se la stringa non inizia nemmeno come numero. Quindi otterrai NaN.

Una buona tecnica generica per i numeri delle forme è qualcosa del genere:

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

Se sei pronto a fondere una stringa non valida su 0, puoi utilizzare:

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


4

Questo non riassumerà il numero; invece lo concatenerà:

var x = y + z;

Devi fare:

var x = (y)+(z);

È necessario utilizzare parseInt per specificare l'operazione sui numeri. Esempio:

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

Questa dovrebbe essere la risposta corretta additione subtractionnon quella accettata.
MR_AMDEV

3

Questo codice somma entrambe le variabili! Mettilo nella tua funzione

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

1

Ti manca la conversione del tipo durante il passaggio di aggiunta ...
var x = y + z;dovrebbe esserevar 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
Aggiungi una spiegazione con la risposta su come questa risposta aiuta OP nel risolvere il problema attuale
ρяσѕρєя K

1

È molto semplice:

<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

Prova questo:

<!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
Benvenuti in SO! Puoi per favore spiegare qualcosa in più? La tua risposta è solo un codice, quindi potrebbe funzionare, ma l'interrogante (o altri visitatori!) Potrebbe non capire perché funzioni.
Chilion,

1

Se abbiamo due campi di input, quindi ottenere i valori dai campi di input e quindi aggiungerli utilizzando 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);
});

0

Puoi fare un controllo preliminare con un'espressione regolare mentre sono numeri come

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

Invece di espressioni regolari puoi semplicemente usare parseXX e controllare il ritorno di NaN.
maturazione

La convalida dei dati inseriti dall'utente è sempre un buon piano, ma è ancora necessario convertire le stringhe di input in forma numerica prima di poter effettuare un'aggiunta numerica.
nnnnnn,

0

Usalo parseFloatconvertirà la stringa in numero compresi i valori decimali.

 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

Puoi anche scrivere: var z = x - -y; E ottieni la risposta corretta.

<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

Qui va il tuo codice analizzando le variabili nella funzione.

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

Risposta

Inserisci qui la descrizione dell'immagine


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.