2009-06-05 14 views
7

Non sono così bravo con JS e per qualche motivo quando provo ad aggiungere due campi insieme li unisco piuttosto che sommare la somma .. questo è il codice che sto cercando di usare ..Simple JavaScript addition issues

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

    }; 

Il totalVal è eco/allertare out 68.50378.00 piuttosto che aggiungere loro insieme .. qualcuno potrebbe dirmi dove ho sbagliato? :(L'idea è di aggiornare il campo di testo "totale" con totalVal, ma non sono ancora arrivato lontano!

+3

La ragione si stanno ottenendo la stringa è che javascript tratteranno un'aggiunta come concatenazione di stringhe se uno degli argomenti sono una stringa. Quando prendi un valore da un elemento, è sempre una stringa, quindi devi lanciarlo come suggerisce karim79. –

+0

javascript sta facendo esattamente quello che stai dicendo di fare..aggiungere le stringhe insieme, per aggiungere matematicamente devi trasmettere a un numero di tipo – TStamper

risposta

27

È necessario convertire i valori ad un galleggiante prima di aggiungere di loro:

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

EDIT: Ecco un esempio completo che comprende un assegno di 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

ha finito per usare il tuo codice, grazie mille (e anche a tutti gli altri!): D – SoulieBaby

+1

potrebbe essere meglio usare 'Numero()' e non 'parseFloat()' come il primo è meno indulgente (ad es. 'ignorare caratteri non numerici finali) o anche usare un'espressione regolare per validare manualmente l'input – Christoph

1

Non ho testato il tuo codice quindi potrebbero esserci altri problemi ma la correzione che segue usando parseFloat dovrebbe fermarsi la concatenazione e aggiungere i numeri insieme

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

Dovrebbe probabilmente essere float piuttosto che in. –

+2

parseInt arrotonderà a un numero intero, e abbiamo a che fare con i prezzi :) – karim79

+1

dovresti usare parseFloat invece di parseInt dato che i valori non sono interi – Geoff

3

parseFloat fa il trucco

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

Prova a convertire i numeri di carri:..

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

Trattano le spese di spedizione e il subtotale come stringhe e le concatenano. Puoi provare qualcosa del genere:

var totalVal = 0+postage+subtotal; 

Questo dovrebbe forzarlo in modalità numerica.

Tuttavia, ciò potrebbe causare problemi se i valori non finiscono per essere numeri. Dovresti eseguirlo attraverso le funzioni di analisi dei numeri corrette e aggiungere controlli per assicurarti che abbiano analizzato correttamente altrimenti ti ritroverai con NaN.

1

È necessario analizzare il numero di primo. Questo dovrebbe funzionare.

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

Grazie per tutte le risposte! Io li provare, io sono sicuro che sono meglio di quanto la mia soluzione:

<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

Tutti gli altri ha l'idea giusta con parseFloat.

Volevo solo dire che io preferisco di ripulire valori numerici come questo (al contrario di analisi con substr):

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

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

che sostituiscono chiamata sarà rimuovere eventuali caratteri dalla stringa tranne0 -9 e . (periodo). Non lo /g alla fine della regex. Questo è importante perché, senza di esso, verrà sostituita solo la prima occorrenza di corrispondenza.

+0

ahh grazie, lo userò invece sono relativamente nuovo per javascript quindi non conosco tutti i dettagli: S – SoulieBaby

+0

Puoi vuoi cambiare quel modello in: /[=0-9.]*/ altrimenti corrisponde solo al primo carattere. –

+0

E anche in questo caso corrisponde solo quando all'inizio della stringa c'è un carattere non numerico. La mia preferenza in questo caso è stare lontano dalle espressioni regolari e lasciare che javascript provi ad analizzare il numero. parseFloat è piuttosto robusto e può gestire input come "1abc" (parseFloat restituisce semplicemente 1). La risposta che offro sopra evita i pericoli delle espressioni regolari. ;) –

1

più unario dovrebbe funzionare:

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

Ma probabilmente intendeva la vostra affrancatura e le variabili totali parziali per essere i numeri piuttosto che stringhe, quindi ...

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

Avendo ottenuto lo stesso tipo di problemi Ho esaminato le funzioni JS parseFloat e parseInt e le ho trovate sviluppate male.

Quindi, pertanto, prevengo l'intero problema moltiplicando il valore * 1 del valore dell'elemento prima di aggiungerli. Ciò impone a JS di considerare il risultato come numerico anche se il valore è vuoto, in modo che possa essere gestito correttamente. Come segue:

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

Supponendo si vede che "el_1" ed altri sono i nomi di campo nella forma.

0

1.Simple javascript Oltre programma

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