Come aggiungere due stringhe come se fossero numeri?


176

Ho due stringhe che contengono solo numeri:

var num1 = '20',
    num2 = '30.5';

Mi sarei aspettato di poterli sommare, ma invece sono stati concatenati:

num1 + num2; // = '2030.5'

Come posso forzare queste stringhe a essere trattate come numeri?

Risposte:


378

Vorrei usare l'operatore più unario per convertirli prima in numeri.

+num1 + +num2;

9
Molto bello. Grazie per averlo condiviso. Ho trovato questo articolo che descrive l'operatore plus unario e alcuni degli effetti utili che ha su diversi tipi di dati. xkr.us/articles/javascript/unary-add
mrtsherman

4
Ma se quei numeri sono più grandi di 2 ^ 53, dovrai creare una funzione per aggiungere parti delle stringhe e trasportare i riporti su ciascuna parte in un ciclo. : D
trusktr,

2
Questo mi ha dato un errore, quindi ho usato parseFloat () invece.
Hawkee,

1
Vedi anche @NicholasCarey risposta qui sotto: stackoverflow.com/a/8976770/1579667
Benj

C'è un modo meno confuso per farlo? (Dichiarazione di non responsabilità: è così che l'ho sempre fatto.)
Seebiscuit,

20

Documenti MDN per parseInt
Documenti MDN per parseFloat

In parseInt radix è specificato come dieci in modo da essere nella base 10. In javascript senza restrizioni un numero anteposto 0viene trattato come ottale. Ciò ovviamente causerebbe problemi!

parseInt(num1, 10) + parseInt(num2, 10) //base10
parseFloat(num1) + parseFloat(num2)

Vedi anche la risposta di ChaosPandion per un utile collegamento usando un operatore unario . Ho creato un violino per mostrare i diversi comportamenti.

http://jsfiddle.net/EtX6G/

var ten = '10';
var zero_ten = '010';
var one = '1';
var body = document.getElementsByTagName('body')[0];

Append(parseInt(ten) + parseInt(one));
Append(parseInt(zero_ten) + parseInt(one));
Append(+ten + +one);
Append(+zero_ten + +one);

function Append(text) {
    body.appendChild(document.createTextNode(text));
    body.appendChild(document.createElement('br'));
}

2
usa parseFloat () se hai i decimali. :)
Diodeus - James MacFarlane il

1
Inoltre dovresti davvero specificare la radice come 10.
ChaosPandion il

Ed +num1 + +num2è più corto, probabilmente più elegante. Fondamentalmente l' +operatore unario si converte inNumber
Raynos il

Non perdere il decimale di 0,5 quando si analizza?
DOK,

Per quello che vale, parseInt & parseFloat sono sperimentali e non sono ampiamente supportati su tutti i browser - quasi nessun supporto sui dispositivi mobili.
Sarà il

14

Consiglierei di utilizzare l'operatore unario positivo, per forzare un'eventuale stringa da trattare come numero, tra parentesi per rendere il codice più leggibile come il seguente:

(+varname)

Quindi, nel tuo caso è:

var num1 = '20',
    num2 = '30.5';

var sum = (+num1) + (+num2);

// Just to test it
console.log( sum ); // 50.5



6

Se devi aggiungere due stringhe insieme che sono numeri molto grandi, dovrai valutare l'aggiunta in ogni posizione della stringa:

function addStrings(str1, str2){
  str1a = str1.split('').reverse();
  str2a = str2.split('').reverse();
  let output = '';
  let longer = Math.max(str1.length, str2.length);
  let carry = false;
  for (let i = 0; i < longer; i++) {
    let result
    if (str1a[i] && str2a[i]) {
      result = parseInt(str1a[i]) + parseInt(str2a[i]);

    } else if (str1a[i] && !str2a[i]) {
      result = parseInt(str1a[i]);

    } else if (!str1a[i] && str2a[i]) {
      result = parseInt(str2a[i]);
    }

    if (carry) {
        result += 1;
        carry = false;
    }
    if(result >= 10) {
      carry = true;
      output += result.toString()[1];
    }else {
      output += result.toString();
    }
  }
  output = output.split('').reverse().join('');

  if(carry) {
    output = '1' + output;
  }
  return output;
}


4

provare

var x = parseFloat(num1) + parseFloat(num2) ;

o, a seconda delle tue esigenze:

var x = parseInt(num1) + parseInt(num2) ;

http://www.javascripter.net/faq/convert2.htm

Potresti prendere il libro Javascript: The Good Parts , di Douglas Crockford. Javascript ha una raccolta piuttosto consistente di gotcha! Questo libro fa molto per chiarirli. Guarda anche

e l'eccellente saggio di Crockford, Javascript: il linguaggio di programmazione più frainteso al mondo .


3

Ho sempre sottratto zero.

num1-0 + num2-0;

Concesso che il metodo dell'operatore unario abbia un carattere in meno, ma non tutti sanno cosa sia un operatore unario o come google scoprire quando non sanno come si chiama.


2

Se si desidera eseguire operazioni con numeri come stringhe (come nel caso in cui numeri possono contenere più di 64 bit), è possibile utilizzare la libreria di interi di grandi dimensioni .

const bigInt = require('big-integer')
bigInt("999").add("1").toString() // output: "1000"

2

Qui, hai due opzioni per fare questo: -

1.È possibile utilizzare il plus unario per convertire il numero di stringa in numero intero.

2.Puoi anche ottenere questo risultato analizzando il numero nel tipo corrispondente. cioè parseInt (), parseFloat () ecc

.

Ora ti mostrerò qui con l'aiuto di esempi (Trova la somma di due numeri).

Utilizzo dell'operatore unary plus

<!DOCTYPE html>
<html>
<body>

<H1>Program for sum of two numbers.</H1>
<p id="myId"></p>
<script>
var x = prompt("Please enter the first number.");//prompt will always return string value
var y = prompt("Please enter the second nubmer.");
var z = +x + +y;    
document.getElementById("myId").innerHTML ="Sum of "+x+" and "+y+" is "+z;
</script>
</body>
</html>

Utilizzando l'approccio di analisi-

<!DOCTYPE html>
<html>
<body>

<H1>Program for sum of two numbers.</H1>
<p id="myId"></p>
<script>
var x = prompt("Please enter the first number.");
var y = prompt("Please enter the second number.");   
var z = parseInt(x) + parseInt(y);
document.getElementById("myId").innerHTML ="Sum of "+x+" and "+y+" is "+z;
</script>
</body>
</html>

2
function sum(){
    var x,y,z;
    x = Number(document.getElementById("input1").value);
    y = Number(document.getElementById("input2").value);
    z = x + y;
    document.getElementById("result").innerHTML = z ;
}

1

È possibile utilizzare parseIntper analizzare una stringa in un numero. Per essere al sicuro delle cose, passa sempre 10come secondo argomento da analizzare nella base 10.

num1 = parseInt(num1, 10);
num2 = parseInt(num2, 10);
alert(num1 + num2);

1

Assicurati di arrotondare la risposta finale a meno di 16 cifre decimali per i float poiché lo script java è difettoso.

Ad esempio 5 - 7,6 = -2,5999999999999996


1
JavaScript non è difettoso, utilizza lo stesso punto IEEE754 in virgola mobile di quasi tutto il resto. L'imprecisione che hai notato è una conseguenza naturale dell'uso dell'aritmetica binaria in virgola mobile sui numeri specificati e visualizzati in decimale.
Michael Geary,

1

@ cr05s19xx ha suggerito una domanda duplicata:

JavaScript è un po 'divertente quando si tratta di numeri e aggiunte.

Dare quanto segue

'20' - '30' = 10; // restituisce 10 come numero '20' + '30' = '2030'; // Restituisce come stringa I valori restituiti da document.getElementById sono stringhe, quindi è meglio analizzarli tutti (anche quello che funziona) per numerarli, prima di procedere con l'aggiunta o la sottrazione. Il tuo codice può essere:

function myFunction() {
  var per = parseInt(document.getElementById('input1').value);
  var num = parseInt(document.getElementById('input2').value);
  var sum = (num / 100) * per;
  var output = num - sum;

  console.log(output);

  document.getElementById('demo').innerHTML = output;
}

function myFunction2() {
  var per = parseInt(document.getElementById('input3').value);
  var num = parseInt(document.getElementById('input4').value);
  var sum = (num / 100) * per;
  var output = sum + num;

  console.log(output);

  document.getElementById('demo1').innerHTML = output;
}

0

Utilizzare il parseFloatmetodo per analizzare le stringhe in numeri in virgola mobile:

parseFloat(num1) + parseFloat(num2)

0

Lo uso nel mio progetto. Uso + segno per trattare la stringa come un numero (nella variabile with_interesst)

<script>
function computeLoan(){
var amount = document.getElementById('amount').value;
var interest_rate = document.getElementById('interest_rate').value;
var days = document.getElementById('days').value;
var interest = (amount * (interest_rate * .01)) / days;
var payment = ((amount / days) + interest).toFixed(2);
var with_interest = (amount * (interest_rate * .01));
var with_interesst = (+amount * (interest_rate * .01)) + (+amount);
payment = payment.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
document.getElementById('payment').innerHTML = "Target Daily = PHP"+payment;
document.getElementById('with_interesst').innerHTML = "Amount w/Interest =   PHP"+with_interesst;
}
</script>

<div name="printchatbox" id="printchatbox">
 <form id="Calculate" class="form-horizontal">
   <h2>You Can Use This Calculator Before Submit </h2>
   <p>Loan Amount: PHP<input id="amount" type="number" min="1" max="1000000"  onchange="computeLoan()"></p>
   <p>Interest Rate: <input id="interest_rate" type="number" min="0" max="100" value="10" step=".1" onchange="computeLoan()">%</p>
    <p>Term<select id="days" type="number" min="1" max="72" step=".1" onchange="computeLoan()">
    <option value="40">40 Days</option>
    <option value="50">50 Days</option>
    <option value="60">60 Days</option>
    <option value="70">70 Days</option>
    <option value="80">80 Days</option>
    <option value="90">90 Days</option>
    <option value="100">100 Days</option>
    <option value="120">120 Days</option>
    </select>
    </p>                        
   <h2 id="payment"></h2>
   <h2 id ="with_interesst"></h2>
 </form>
</div>

Spero che sia d'aiuto


0
document.getElementById(currentInputChoosen).value -= +-100;

Funziona nel mio caso, se ti imbatti nello stesso problema come me e non riesci a trovare una soluzione per quel caso e trovi questa domanda SO.

Ci scusiamo per un po 'fuori tema, ma appena ho scoperto che funziona, ho pensato che valesse la pena condividere.

Non so se si tratta di una soluzione sporca, o effettivamente legittima.


-1

Puoi usare così:

var num1 = '20',
    num2 = '30.5';

alert((num1*1) + (num2*1)); //result 50.5

Quando si applica * 1 in num1, convertire la stringa in un numero.

se num1 contiene una lettera o una virgola, restituisce NaN moltiplicando per 1

se num1 è null, num1 restituisce 0

Cordiali saluti!!!


-2

Prova questo se stai cercando un semplice codice Javascript e vuoi usare due caselle di input e aggiungere numeri dai due valori. Ecco il codice.

    Enter the first number: <input type="text" id="num1" /><br />
    Enter the seccond number: <input type="text" id="num2" /><br />
    <input type="button" onclick="call()" value="Add"/>

    <script type="text/javascript">
    function call(){
    var q=parseInt(document.getElementById("num1").value);
    var w=parseInt(document.getElementById("num2").value);
    var result=q+w;
    }
    </script>

per maggiori dettagli, visitare http://informativejavascript.blogspot.nl/2012/12/javascript-basics.html

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.