2009-06-05 9 views
7

Ich bin nicht so gut mit JS und aus irgendeinem Grund, wenn ich versuche, zwei Felder zusammenzufügen es verbindet sie eher als die Summe zusammen .. das ist der Code, den ich versuche zu verwenden ..Einfache JavaScript-Zusatzprobleme

function calculateTotal() { 

     var postageVal = document.getElementById('postage').value; //$68.50 
     var subtotalVal = document.getElementById('subtotal').value; //$378.00 

     var postage = postageVal.substr(1); //68.50 
     var subtotal = subtotalVal.substr(1); //378.00 
     var totalVal = postage+subtotal; 

     alert(postage); 
     alert(subtotal); 
     alert(totalVal); 

    }; 

Die totalVal hallt/68.50378.00 alarmieren, anstatt sie zusammen Hinzufügen .. könnte mir bitte jemand sagen, wo ich falsch gegangen? :(Die Idee ist, das "totale" Textfeld mit totalVal zu aktualisieren, aber ich bin noch nicht so weit!

+3

Der Grund, warum Sie die Zeichenfolge bekommen ist, dass Javascript eine Addition als String-Verkettung behandeln wird, wenn eines der Argumente eine Zeichenfolge sind. Wenn Sie einen Wert von einem Element abgreifen, ist es immer eine Zeichenkette, also müssen Sie es so umwandeln, wie es karim79 vorschlägt. –

+0

Javascript tut genau das, was Sie sagen, es zu tun..add Strings zusammen, um mathematisch zu addieren, müssen Sie auf eine Zahl Typ – TStamper

Antwort

27

Sie müssen Ihre Werte mit einem Schwimmer konvertieren, bevor das Hinzufügen ihnen:

var totalVal = parseFloat(postage) + parseFloat(subtotal); 

EDIT: Hier ist ein vollständiges Beispiel, das einen Scheck für NaN enthält:

function calculateTotal() { 

    var postageVal = document.getElementById('postage').value; //$68.50 
    var subtotalVal = document.getElementById('subtotal').value; //$378.00 

    var postage = parseFloat(postageVal.substr(1)); //68.50 
    var subtotal = parseFloat(subtotalVal.substr(1)); //378.00 
    var postageAsFloat = isNaN(postage) ? 0.0 : postage; 
    var subtotalAsFloat = isNaN(subtotal) ? 0.0 : subtotal; 
    var totalVal = postageAsFloat + subtotalAsFloat; 

    alert(postage); 
    alert(subtotal); 
    alert(totalVal); 

}; 
+1

endete mit Ihrem Code, vielen Dank (und an alle anderen auch!): D – SoulieBaby

+1

es könnte besser sein, 'Number()' und nicht 'parseFloat()' zu verwenden, da der ehemalige weniger nachsichtig ist (zB gewonnen Ignoriere nachfolgende nicht-numerische Zeichen) oder benutze sogar einen regulären Ausdruck, um die Eingabe manuell zu validieren – Christoph

1

Ich habe Ihren Code nicht getestet, so dass es andere Probleme geben kann, aber das Update unten mit parseFloat sollte aufhören die Verkettung und fügen Sie die Zahlen zusammen

function calculateTotal() { 

    var postageVal = document.getElementById('postage').value; //$68.50 
    var subtotalVal = document.getElementById('subtotal').value; //$378.00 

    var postage = postageVal.substr(1); //68.50 
    var subtotal = subtotalVal.substr(1); //378.00 
    var totalVal = parseFloat(postage)+parseFloat(subtotal); 

    alert(postage); 
    alert(subtotal); 
    alert(totalVal); 

}; 
+0

zu werfen Es sollte wahrscheinlich float statt in. –

+2

parseInt wird auf eine ganze Zahl runden, und Wir haben es mit Preisen zu tun :) – karim79

+1

Sie sollten parseFloat anstelle von parseInt verwenden, da die Werte keine ganzen Zahlen sind. – Geoff

3

parseFloat funktioniert der Trick

var postage = parseFloat(postageVal.substr(1)); 
var subtotal = parseFloat(subtotalVal.substr(1)); 
9

Versuchen Sie, die Zahlen zu Schwimmern Umwandlung:..

function calculateTotal() { 

    var postageVal = document.getElementById('postage').value; //$68.50 
    var subtotalVal = document.getElementById('subtotal').value; //$378.00 

    var postage = parseFloat(postageVal.substr(1)); //68.50 
    var subtotal = parseFloat(subtotalVal.substr(1)); //378.00 
    var totalVal = postage+subtotal; 

    alert(postage); 
    alert(subtotal); 
    alert(totalVal); 

}; 
2

Es behandelt Porto und Zwischensumme als Zeichenfolgen und verkettet sie. Man könnte so etwas wie dies versuchen:

var totalVal = 0+postage+subtotal; 

, dass es in den Zahlenmodus zwingen sollte.

Dies kann jedoch zu Problemen führen, wenn die Werte keine Zahlen sind. Sie sollten es durch die richtige Anzahl Parsing-Funktionen ausführen und Prüfungen hinzufügen, um sicherzustellen, dass sie richtig analysiert, sonst werden Sie mit NaN enden.

1

Sie benötigen die Nummer analysieren zuerst. Das sollte funktionieren.

function calculateTotal() { 

    var postageVal = document.getElementById('postage').value; //$68.50 
    var subtotalVal = document.getElementById('subtotal').value; //$378.00 

    var postage = parseFloat(postageVal.substr(1)); //68.50 
    var subtotal = parseFloat(subtotalVal.substr(1)); //378.00 
    var totalVal = postage+subtotal; 

    alert(postage); 
    alert(subtotal); 
    alert(totalVal); 

}; 
0

Danke für alle Antworten! Ich werde versuchen, sie aus, ich bin sicher, sie sind besser als meine Lösung:

<script type="text/javascript"> 
function calculateTotal() { 

    var postageVal = document.cart.postage.value; 
    var subtotalVal = document.cart.subtotal.value; 

    var postage = postageVal.substr(1); 
    var subtotal = subtotalVal.substr(1); 
    var totalVal = Number(postage)+Number(subtotal); 

    document.cart.total.value = "$"+totalVal.toFixed(2); 

}; 
</script> 
4

Jeder andere hat die richtige Idee mit parseFloat.

Ich wollte nur erwähnen, dass ich es vorziehen, numerische Werte wie diese zu bereinigen (wie bei substr zu Parsen gegen):

var postageVal = document.getElementById('postage').value; //$68.50 

var postage = parseFloat(postageVal.replace(/[^0-9.]/g, '')); 

diesen Anruf ersetzen werden alle Zeichen aus dem außer0 String entfernen -9 und . (Zeitraum). Nicht die /g am Ende der Regex. Das ist wichtig, weil ohne sie nur das erste übereinstimmende Vorkommen ersetzt wird.

+0

ahh danke, werde das stattdessen verwenden, bin relativ neu in Javascript, so dass ich nicht alle Ins und Outs kenne: S – SoulieBaby

+0

Du kannst möchte das Muster in: /[^0-9.]*/ ändern, ansonsten entspricht es nur dem ersten Zeichen. –

+0

Und selbst dann passt es nur, wenn am Anfang der Zeichenfolge ein Zeichen ohne Ziffer steht. Meine Präferenz in diesem Fall ist es, sich von regulären Ausdrücken fern zu halten und Javascript einfach versuchen zu lassen, die Zahl zu analysieren. parseFloat ist ziemlich robust und kann Eingaben wie "1abc" verarbeiten (parseFloat gibt einfach 1 zurück). Die Antwort, die ich oben anbiete, vermeidet die Gefahren regulärer Ausdrücke. ;) –

1

Unäres Plus sollte funktionieren:

var totalVal = (+postage) + (+subtotal); 

Aber Sie wahrscheinlich bestimmt Ihr Porto und Wert Ihre Variablen Zahlen und nicht als Strings, also ...

var postage = +postageVal.substr(1); //68.50 
var subtotal = +subtotalVal.substr(1); //378.00 
var totalVal = postage+subtotal; 
1

mit der gleichen Art von Schwierigkeiten hatten Ich habe die Funktionen JS parseFloat und parseInt untersucht und festgestellt, dass sie schlecht entwickelt sind.

Also ich verhindere das ganze Problem durch Multiplikation der Wert des Elements * 1 vor dem Hinzufügen von ihnen. Dadurch wird JS gezwungen, das Ergebnis als numerisch zu behandeln, auch wenn der Wert leer ist, damit es korrekt verarbeitet werden kann. Wie folgt:

var TEMP = (1 * el_1.value) + (1 * el_2.value); 
document.getElementById("el_tot").value = TEMP; 

Unter der Annahme, sehen Sie, dass "el_1" et al die Feldnamen in Form sind.

0

1.simple javascript Zusätzlich Programm

<!DOCTYPE html> 
<html> 
<body> 
<p>This calculation perfoms an addition, and returns the result by using a  JavaScript.  Check for a demo</p> 
<form> 
Enter no 1:<input type="text" name="a"><br> 
Enter no 2:<input type="text" name="b"><br> 
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&  nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<button onclick="calc(this.form)">Calculate</button> 
</form> 

<script> 
function calc(form) 
{ 
var a=eval(form.a.value); 
var b=eval(form.b.value); 
var c=a+b; 
alert("The sum is " + c); 
} 
</script> 

</body> 
</html>