2009-06-05 16 views
7

Nie jestem tak dobry z JS iz jakiegoś powodu, gdy próbuję dodać dwa pola razem, dołącza się je zamiast sumować razem ... to kod, którego próbuję użyć ..Proste problemy z dodawaniem JavaScriptu

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

    }; 

totalVal jest echem/ostrzeganie się 68.50378.00 zamiast dodawać je razem .. może ktoś proszę mi powiedzieć, gdzie mam pójść źle? :(Chodzi o to, aby zaktualizować "całkowite" pole tekstowe z totalVal, ale jeszcze nie dotarłem tak daleko!

+3

Powodem są coraz ciąg jest to, że JavaScript traktować jako dodatek połączonego łańcucha znaków, jeśli któryś z argumentów są ciągiem. Gdy pobierasz wartość z elementu, zawsze jest to ciąg znaków, więc musisz go rzutować tak, jak sugeruje karim79. –

+0

javascript robi dokładnie to, co mówisz, aby to zrobić .. dodać ciągi razem, aby dodać matematycznie musisz obsłużyć numer typu – TStamper

Odpowiedz

27

trzeba konwertować wartości do pływaka przed dodaniem ich:

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

EDIT: Tutaj jest pełna przykładów, które obejmuje czek na NaN:

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

skończyło się na używaniu twojego kodu, dziękuję ci bardzo (i wszystkim innym też!): D – SoulieBaby

+1

lepiej byłoby użyć 'Number()', a nie 'parseFloat()' jako pierwszego jest mniej wyrozumiały (np. zignorować końcowe znaki nieliczbowe) lub nawet użyć wyrażenia regularnego do ręcznego sprawdzenia poprawności danych wejściowych – Christoph

1

Nie przetestowałem twojego kodu, więc mogą być inne problemy, ale poprawka poniżej za pomocą parseFloat powinien przestać konkatenacją i dodać numery wspólnie

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

Powinien prawdopodobnie być zmiennoprzecinkowy, a nie w. –

+2

parseInt zaokrągli do liczby całkowitej, i mamy do czynienia z cenami :) – karim79

+1

powinieneś użyć parseFloat zamiast parseInt ponieważ wartości nie są liczbami całkowitymi – Geoff

3

parseFloat załatwia sprawę

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

Spróbuj konwersji liczb do pływaków..

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

To przetwarzanie znaczków pocztowych i podsumowych jako ciągów i łączenie ich. Możesz spróbować czegoś takiego:

var totalVal = 0+postage+subtotal; 

To powinno zmusić go do trybu liczbowego.

Może to jednak prowadzić do problemów, jeśli wartości nie będą liczbami. Powinieneś uruchomić go poprzez odpowiednie funkcje analizowania liczb i dodać sprawdzenia, aby upewnić się, że zostały poprawnie przetworzone, inaczej skończysz z NaN.

1

Musisz przeanalizować liczbę pierwszy. To powinno działać.

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

Dzięki za wszystkie odpowiedzi! Postaram się je, jestem pewien, że są lepsze niż moje rozwiązanie:

<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

Każdy inny ma prawo pomysł z parseFloat.

Chciałem tylko wspomnieć, że wolę, aby oczyścić wartości liczbowych jak to (w przeciwieństwie do parsowania z substr):

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

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

To zastąpić połączenia usunie żadnych znaków z łańcucha wyjątkiem0 -9 i . (kropka). Na końcu wyrażeń regularnych nie jest to /g. Jest to ważne, ponieważ bez niego tylko pierwsze pasujące wystąpienie zostanie zastąpione.

+0

ahh dziękuję, wykorzystam to zamiast tego, jestem stosunkowo nowy w javascript, więc nie znam wszystkich tajników: S – SoulieBaby

+0

Możesz chcesz zmienić ten wzór na: /[^0-9.]*/ w przeciwnym razie dopasowuje tylko pierwszy znak. –

+0

I nawet wtedy pasuje tylko wtedy, gdy na początku łańcucha znajduje się znak bez cyfr. W tym przypadku preferuję trzymanie się z dala od wyrażeń regularnych i pozwolenie javascriptowi na przeanalizowanie liczby. parseFloat jest raczej niezawodny i może obsłużyć dane wejściowe, takie jak "1abc" (parseFloat po prostu zwraca 1). Odpowiedź, którą proponuję powyżej, pozwala uniknąć niebezpieczeństw wyrażeń regularnych. ;) –

1

Jednoargumentowy Plus powinno działać:

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

Ale pewnie ma swoją pocztowy i zmienne Suma częściowa być numery zamiast strun, więc ...

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

Miał ten sam rodzaj kłopotów Zbadałem funkcje JS parseFloat i parseInt i odkryłem, że są źle opracowane.

Dlatego też zapobiegam całemu problemowi, mnożąc wartość elementu przed dodaniem wartości * 1. Zmusza to JS do potraktowania wyniku jako wartości numerycznej, nawet jeśli wartości są puste, aby można było poprawnie obsłużyć. W następujący sposób:

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

Zakładając, że "el_1" i inne są nazwami pól w formularzu.

0

1.simple javascript Program dodatek

<!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> 
Powiązane problemy