Come forzare JS a fare matematica invece di mettere insieme due stringhe


102

Ho bisogno di javascript per aggiungere 5 a una variabile intera, ma invece tratta la variabile come una stringa, quindi scrive la variabile, quindi aggiunge 5 alla fine della "stringa". Come posso invece costringerlo a fare matematica?

var dots = document.getElementById("txt").value; // 5
function increase(){
    dots = dots + 5;
}

Produzione: 55

Come posso forzare l'uscita 10?


3
Questo particolare esempio produce 10.
ingannare


10
Hai posto un peso eccessivo su coloro che vogliono aiutarti scaricando tutto il tuo codice senza fare alcun tentativo di ridurlo. Provalo tu stesso ... gli attributi CSS per #controlfanno la differenza sul tuo problema? In caso contrario, eliminarli e non mostrarceli. Continua a ridurre il codice fino a quando non avrai il test case minimo assoluto necessario per riprodurre il problema. La maggior parte del tempo a fare in modo causerà voi di trovare il problema e imparare nel processo. Se non lo risolvi da solo, è molto probabile che tu riceva aiuto rapido con il tuo semplice esempio.
Phrogz

Risposte:


108

Hai la linea

dots = document.getElementById("txt").value;

nel tuo file, questo imposterà i punti come una stringa perché il contenuto di txt non è limitato a un numero.

per convertirlo in un int cambia la riga in:

dots = parseInt(document.getElementById("txt").value, 10);

Nota: 10qui specifica il decimale (base 10). Senza questo alcuni browser potrebbero non interpretare correttamente la stringa. Vedere MDN: parseInt.


3
scorciatoia ... punti = + document.getElementById ("txt"). value
Tracker1

5
parseInt (..., 10) inoltre, usa sempre una radice ... un controllo di integrità ... if (! dots || dots <1) may be in order ...
Tracker1

1
Utilizzare meglio l'operatore di incremento per l'addizione. come VARIABILE ++ invece di VAR = VAR + 1;
gnganpath

54

il più semplice:

dots = dots*1+5;

i punti verranno convertiti in numero.


34
Anche più semplice di così sarebbe dots = +dots+5.
Andy E


9

Aggiungo questa risposta perché non la vedo qui.

Un modo è mettere un carattere "+" davanti al valore

esempio:

var x = +'11.5' + +'3.5'

x === 15

Ho scoperto che questo è il modo più semplice

In questo caso, la riga:

dots = document.getElementById("txt").value;

potrebbe essere cambiato in

dots = +(document.getElementById("txt").value);

per forzarlo a un numero

NOTA:

+'' === 0
+[] === 0
+[5] === 5
+['5'] === 5

8

parseInt() dovrebbe fare il trucco

var number = "25";
var sum = parseInt(number, 10) + 10;
var pin = number + 10;

Ti dà

sum == 35
pin == "2510"

http://www.w3schools.com/jsref/jsref_parseint.asp

Nota: 10in parseInt(number, 10)specifica il decimale (base 10). Senza questo alcuni browser potrebbero non interpretare correttamente la stringa. Vedere MDN: parseInt.



1

è davvero semplice

var total = (1 * yourFirstVariablehere) + (1 * yourSecondVariablehere)

questo forza la moltiplicazione di javascript perché non vi è confusione per * accedi a javascript.


1

Puoi aggiungere + dietro la variabile e la forzerà a essere un numero intero

var dots = 5
    function increase(){
        dots = +dots + 5;
    }

1

Dopo aver provato la maggior parte delle risposte qui senza successo per il mio caso particolare, ho pensato a questo:

dots = -(-dots - 5);

I segni + sono ciò che confonde js e questo li elimina completamente. Semplice da implementare, anche se potenzialmente confuso da capire.


-3

AGGIORNATO dall'ultimo downvoted di questo ...

Ho visto solo la porzione

var dots = 5
function increase(){
    dots = dots+5;
}

prima, ma in seguito mi è stato mostrato che la txtscatola alimenta la variabile dots. Per questo motivo, dovrai essere sicuro di "ripulire" l'input, per assicurarti che contenga solo numeri interi e non codice dannoso.

Un modo semplice per farlo è analizzare la casella di testo con un onkeyup()evento per assicurarsi che abbia caratteri numerici:

<input size="40" id="txt" value="Write a character here!" onkeyup="GetChar (event);"/>

dove l'evento darebbe un errore e cancellerebbe l'ultimo carattere se il valore non è un numero:

<script type="text/javascript">
    function GetChar (event){
        var keyCode = ('which' in event) ? event.which : event.keyCode;
        var yourChar = String.fromCharCode();
        if (yourChar != "0" &&
            yourChar != "1" &&
            yourChar != "2" &&
            yourChar != "3" && 
            yourChar != "4" &&
            yourChar != "5" &&
            yourChar != "6" && 
            yourChar != "7" &&
            yourChar != "8" && 
            yourChar != "9")
        {
            alert ('The character was not a number');
            var source = event.target || event.srcElement;
            source.value = source.value.substring(0,source.value-2);
        }
    }
</script>

Ovviamente potresti farlo anche con regex, ma ho scelto la via più pigra.

Da allora sapresti che solo i numeri potrebbero essere nella casella, dovresti essere in grado di usare solo eval():

dots = eval(dots) + 5;

2
eval()è pericoloso se dotsproviene dall'input dell'utente, in particolare se proviene dall'input memorizzato. Maggiori informazioni
Ciad Levy

@ChadLevy Grazie per il collegamento - una buona lettura - e per aver sollevato l'argomento, ma in questo caso la preoccupazione era ingiustificata, poiché non proveniva dall'input dell'utente. dotsera una variabile definita che veniva incrementata e veniva semplicemente scambiata per una stringa. Quindi qualificherò la mia risposta che non dovrebbe essere usata alla leggera, come hai detto, dall'input dell'utente / memorizzato che potrebbe avere il potenziale per un'iniezione di scripting malvagia. Ma anche in questo caso, tale iniezione causerebbe comunque un errore / eccezione di matematica, quindi in realtà non farebbe nulla, in entrambi i casi.
vapcguy

Per coloro che votano perché pensi eval()sia così pericoloso, devi guardare il codice nel contesto che stava usando l'OP. Non è, in questo caso, perché sta usando input che non proviene da una casella di testo o qualsiasi altra forma di input dell'utente in cui potrebbe esserci qualsiasi forma di iniezione di un valore non numerico! Vorrei poter svalutare i tuoi voti negativi!
vapcguy

Un altro downvoter. Ti va di spiegare te stesso, invece di essere solo una pecora? Ci sono momenti in cui eval()va bene e devi guardare al contesto in cui viene utilizzato, invece di credere ciecamente a tutto ciò che leggi senza capirlo davvero!
vapcguy

1
@ChadLevy Ok, su questo punto, hai ragione. Non ho guardato quella sezione - ero concentrato su ciò che ha messo in cima alla pagina: il codice var dots = 5 function increase(){ dots = dots+5; }non utilizza un campo di testo e assegna utilizzando variabili dirette, non dall'input dell'utente. Quindi è quello che ho fatto. Ma ho visto che hai ragione che sta assegnando quel campo di testo txta dots, ed dotsè una variabile globale, e quindi viene aggiornato da quell'input. Hai ragione. Grazie.
vapcguy
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.