2015-09-22 19 views
5

sto lavorando con percentuale e l'setInterval() quindi ho unisNaN() JavaScript, numero di 2 virgole

var intervalId; 
 
    function randomize(){ 
 
     var prc = $("#prc").val(); 
 
     var c = 0 ; 
 
     if (!intervalId){ 
 
      intervalId = setInterval(function(){ 
 
       c = c + 1; 
 
       var attempt = Math.random() * 100; 
 
       if (attempt <= prc){ 
 
        clearInterval(intervalId); 
 
        intervalId = false; 
 
        $("#attemptnbr").val(c); 
 
       } 
 
      }, 100); 
 
     } 
 
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
 

 
Percentage : <input type="text" id="prc"/> 
 
<button onclick="randomize()">GO</button> 
 
Number of attempts :<input type="text" id="attemptnbr"/>

Ma in realtà se l'utente impostare l'ingresso #prc a 50.345.34, la condizione attempt <= prc restituisce sempre true. Ho provato a console.log(isNaN(prc)) quando questo input è impostato su un numero come 50.345.34 e restituisce sempre false.

Perché è considerato un valore numerico?

risposta

7

Ma in realtà se l'utente impostare l'ingresso #prc a 50.345.34, il tentativo < = condizione prc restituisce sempre vero.

Abbastanza sicuro che è un errore di osservazione. Il tuo prc è una stringa, che verrà convertita implicitamente in un numero dall'operatore <=. Il numero sarà NaN perché "50.345.34" non può essere convertito implicitamente e le relazioni che utilizzano NaN non sono mai vere.

Tuttavia in realtà non cambia ciò che si vuole fare a questo proposito, che è di convertire prc ad un numero apposta e testare il risultato:

var intervalId; 
function randomize(){ 
    var prc = +$("#prc").val(); 
    //  ^------------------- Note the +, that converts it to a number 
    if (isNaN(prc)) { 
     // Handle the invalid input 
     return; 
    } 
    var c = 0 ; 
    if (!intervalId){ 
     intervalId = setInterval(function(){ 
      c = c + 1; 
      var attempt = Math.random() * 100; 
      if (attempt <= prc){ 
       clearInterval(intervalId); 
       intervalId = false; 
       console.log(attempt); 
      } 
     }, 100); 
    } 
} 

Vorrei sottolineare che quanto sopra può fare qualcosa che non vuoi se l'input è vuoto: utilizzerà il valore 0, perché +"" è 0. Se non si vuole che, si potrebbe fare questo:

var prcString = $.trim($("#prc").val()); 
var prc = +prcString; 
if (!prcString) { 
    // Handle the fact they didn't enter anything 
    return; 
} 
if (isNaN(prc)) { 
    // Handle the invalid input 
    return; 
} 
+0

Questo valore di input non è un numero anche se ''? –

+2

@TerryRapt: Sì, il 'valore' di un' input' è * sempre * una stringa, anche per i nuovi tipi di input. 'val' di jQuery restituirà sempre una stringa (se ci sono elementi nel set jQuery su cui la chiamate) o' undefined' (se il set è completamente vuoto, ma non si applica nel tuo caso presumo). –

+0

Grazie per tutte queste informazioni, mi ha davvero aiutato. –

0

Perché $("#prc").val() restituisce una stringa. 50.345.34 è una stringa. Quando si confrontano stringa e numero, js confronterà la lunghezza della stringa e il valore numerico.

+2

* "Quando si confrontano stringhe e il numero, js saranno confrontare la lunghezza della stringa e il valore numerico." * No. Quando si utilizza un operatore relazionale su una stringa e un numero, la stringa viene convertita implicitamente in un numero e quindi i due numeri vengono confrontati. –

+2

Sì, hai ragione. Errore mio. – cassln