Wie füge ich zwei Zeichenfolgen hinzu, als wären sie Zahlen?

176

Ich habe zwei Zeichenfolgen, die nur Zahlen enthalten:

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

Ich hätte erwartet, dass ich sie addieren könnte, aber sie werden stattdessen verkettet:

num1 + num2; // = '2030.5'

Wie kann ich erzwingen, dass diese Zeichenfolgen als Zahlen behandelt werden?

Andrew
quelle

Antworten:

378

Ich würde den unären Plus-Operator verwenden, um sie zuerst in Zahlen umzuwandeln.

+num1 + +num2;
ChaosPandion
quelle
9
Sehr cool. Vielen Dank für das Teilen. Ich habe diesen Artikel gefunden, der den unären Plus-Operator und einige der nützlichen Auswirkungen auf verschiedene Datentypen beschreibt. xkr.us/articles/javascript/unary-add
mrtsherman
4
Wenn diese Zahlen jedoch größer als 2 ^ 53 sind, müssen Sie eine Funktion erstellen, um Teile der Zeichenfolgen hinzuzufügen und die Übertragungen auf jeden Teil in einer Schleife zu übertragen. : D
trusktr
2
Dies gab mir einen Fehler, so dass ich stattdessen parseFloat () verwendete.
Hawkee
1
Siehe auch @NicholasCarey Antwort unten: stackoverflow.com/a/8976770/1579667
Benj
Gibt es einen weniger hackigen Weg, dies zu tun? (Haftungsausschluss: So habe ich es immer gemacht.)
Seebiscuit
20

MDN-Dokumente für parseInt
MDN-Dokumente für parseFloat

In parseInt wird radix als zehn angegeben, sodass wir uns in Basis 10 befinden. In nicht striktem Javascript wird eine mit vorangestellte Zahl 0als oktal behandelt. Dies würde offensichtlich Probleme verursachen!

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

In der Antwort von ChaosPandion finden Sie auch eine nützliche Verknüpfung mit einem unären Operator . Ich habe eine Geige aufgestellt, um die verschiedenen Verhaltensweisen zu zeigen.

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'));
}
mrtsherman
quelle
2
Verwenden Sie parseFloat (), wenn Sie Dezimalstellen haben. :)
Diodeus - James MacFarlane
1
Außerdem sollten Sie den Radix wirklich als 10 angeben.
ChaosPandion
Und +num1 + +num2ist kürzer, wohl eleganter. Grundsätzlich +konvertiert der unäre Operator zuNumber
Raynos
Verlierst du nicht die .5 Dezimalstelle, wenn du parseInt machst?
DOK
Für das, was es wert ist, sind parseInt & parseFloat experimentell und werden in allen Browsern nicht allgemein unterstützt - fast keine Unterstützung für Handys.
Will
14

Ich würde empfehlen, den unären Plus-Operator zu verwenden, um zu erzwingen, dass eine eventuelle Zeichenfolge als Zahl in Klammern behandelt wird, um den Code wie folgt lesbarer zu machen:

(+varname)

In Ihrem Fall ist es also:

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

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

// Just to test it
console.log( sum ); // 50.5
Luca Borrione
quelle
12
var result = Number(num1) + Number(num2);
nicht definiert
quelle
6

Wenn Sie zwei Zeichenfolgen addieren müssen, bei denen es sich um sehr große Zahlen handelt, müssen Sie die Addition an jeder Zeichenfolgenposition auswerten:

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;
}
kugyousha
quelle
5

Sie können dies verwenden, um Zahlen hinzuzufügen:

var x = +num1 + +num2;
Gurwinder Singh
quelle
4

Versuchen

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

oder je nach Ihren Bedürfnissen:

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

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

Vielleicht möchten Sie das Buch Javascript: The Good Parts von Douglas Crockford in die Hand nehmen . Javascript hat eine ziemlich große Sammlung von Fallstricken! Dieses Buch trägt wesentlich zur Klärung bei. Siehe auch

und Mr. Crockfords ausgezeichneter Aufsatz, Javascript: Die am meisten missverstandene Programmiersprache der Welt .

Nicholas Carey
quelle
3

Ich habe immer nur Null abgezogen.

num1-0 + num2-0;

Zugegeben, die unäre Operatormethode ist ein Zeichen weniger, aber nicht jeder weiß, was ein unärer Operator ist oder wie man googelt, um herauszufinden, wenn er nicht weiß, wie er heißt.

adam0101
quelle
2

Wenn Sie eine Operation mit Zahlen als Zeichenfolgen ausführen möchten (wie in dem Fall, in dem Zahlen größer als 64 Bit sind), können Sie die Big-Integer- Bibliothek verwenden.

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

Hier haben Sie zwei Möglichkeiten, dies zu tun: -

1.Sie können das unäre Plus verwenden, um die Zeichenfolgennummer in eine Ganzzahl umzuwandeln.

2. Sie können dies auch erreichen, indem Sie die Nummer in den entsprechenden Typ analysieren. dh parseInt (), parseFloat () usw.

.

Jetzt zeige ich es Ihnen hier anhand von Beispielen (Finden Sie die Summe zweier Zahlen).

Verwenden des unären Plus-Operators

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

Verwenden des Parsing-Ansatzes

<!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>
Brajesh
quelle
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 ;
}
Soham Das
quelle
1

Sie können parseInteine Zeichenfolge auf eine Zahl analysieren. Um auf der sicheren Seite zu sein, geben Sie immer 10das zweite Argument an, das in Basis 10 analysiert werden soll.

num1 = parseInt(num1, 10);
num2 = parseInt(num2, 10);
alert(num1 + num2);
Alex Turpin
quelle
1

Stellen Sie sicher, dass Sie Ihre endgültige Antwort auf weniger als 16 Dezimalstellen für Floats runden, da das Java-Skript fehlerhaft ist.

Zum Beispiel 5 - 7,6 = -2,5999999999999996

Nicolas
quelle
1
JavaScript ist nicht fehlerhaft, es verwendet den gleichen IEEE754-Gleitkomma wie fast alles andere. Die von Ihnen festgestellte Ungenauigkeit ist eine natürliche Folge der Verwendung der binären Gleitkomma-Arithmetik für Zahlen, die Sie angeben und dezimal anzeigen.
Michael Geary
1

@ cr05s19xx schlug eine doppelte Frage vor:

JavaScript ist ein bisschen lustig, wenn es um Zahlen und Addition geht.

Folgendes geben

'20' - '30' = 10; // gibt 10 als Zahl zurück '20' + '30' = '2030'; // Gibt sie als Zeichenfolge zurück. Die von document.getElementById zurückgegebenen Werte sind Zeichenfolgen. Daher ist es besser, sie alle (auch die funktionierenden) auf Zahl zu analysieren, bevor Sie mit der Addition oder Subtraktion fortfahren. Ihr Code kann sein:

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;
}
Gary
quelle
0

Verwenden Sie die parseFloatMethode, um die Zeichenfolgen in Gleitkommazahlen zu analysieren:

parseFloat(num1) + parseFloat(num2)
Guffa
quelle
0

Ich benutze dies in meinem Projekt. Ich benutze + Zeichen, um Zeichenfolge als Zahl zu behandeln (in with_interesst Variable)

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

Ich hoffe es hilft


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

Funktioniert in meinem Fall, wenn Sie auf dasselbe Problem wie ich stoßen und keine Lösung für diesen Fall finden und diese SO-Frage finden.

Entschuldigung für ein bisschen Off-Topic, aber als ich gerade herausfand, dass dies funktioniert, dachte ich, dass es sich lohnen könnte, es zu teilen.

Ich weiß nicht, ob es sich um eine schmutzige oder tatsächlich legitime Problemumgehung handelt.

römisch
quelle
-1

Sie können wie folgt verwenden:

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

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

Wenn Sie * 1 in num1 anwenden, konvertieren Sie einen String in eine Zahl.

Wenn num1 einen Buchstaben oder ein Komma enthält, wird NaN multipliziert mit 1 zurückgegeben

Wenn num1 null ist, gibt num1 0 zurück

mit freundlichen Grüßen!!!

Seconddj
quelle
-2

Versuchen Sie dies, wenn Sie nach einfachem Javascript-Code suchen und zwei Eingabefelder verwenden und Zahlen aus den beiden Werten hinzufügen möchten. Hier ist der Code.

    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>

Weitere Informationen finden Sie unter http://informativejavascript.blogspot.nl/2012/12/javascript-basics.html

Kamal
quelle