2015-09-22 18 views
5

pracuję z procentu i setInterval() więc mamisNaN() javascript, numer 2 przecinkami

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"/>

Ale faktycznie, jeśli użytkownik ustaw wejście #prc do 50.345.34, warunek attempt <= prc zawsze zwraca true. Próbowałem console.log(isNaN(prc)), gdy to wejście jest ustawione na numer taki jak 50.345.34 i zawsze zwraca false.

Dlaczego jest uważany za wartość liczbową?

Odpowiedz

7

Ale faktycznie, jeśli użytkownik ustaw wejście #prc do 50.345.34, próba < = stan prc zawsze zwraca true.

Dość pewny, że to błąd obserwacji. Twój prc jest ciągiem, który zostanie niejawnie przekonwertowany na numer przez operatora . Numer będzie wynosił NaN, ponieważ "50.345.34" nie może być niejawnie konwertowane, a relacje używające NaN nigdy nie są prawdziwe.

Jednak tak naprawdę nie zmienia tego, co chcesz zrobić, o tym, co jest konwertować prc do numeru celowo i sprawdzić wynik:

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

Należy zauważyć, że powyższe może zrobić coś, czego nie chcesz, jeśli dane wejściowe to puste: Będzie używać wartości 0, ponieważ +"" jest 0. Jeśli użytkownik nie chce, że można to zrobić:

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

Czy ta wartość wejściowa nie jest liczbą, nawet jeśli ''? –

+2

@ TerryRapt: Tak, "wartość" słowa 'input' to * zawsze * ciąg znaków, nawet dla nowych typów danych wejściowych. jQuery 'val' zwróci tylko ciąg znaków (jeśli istnieją jakieś elementy w zestawie jQuery, do którego go wywołasz) lub' undefined' (jeśli zestaw jest całkowicie pusty, ale nie ma to zastosowania w twoim przypadku, zakładam). –

+0

Dzięki za wszystkie te informacje, naprawdę mi pomogło. –

0

Ponieważ $("#prc").val() zwraca ciąg znaków. 50.345.34 to ciąg znaków. Porównując ciąg i liczbę, js będzie porównywać długość i liczbę łańcuchów.

+2

* „Jeśli porównać ciąg i numer, JS będzie porównać długość ciągów i wartość liczbową.” * Nie Podczas korzystania z relacyjnej operatorowi na ciąg i liczba, ciąg jest niejawnie konwertowany na liczbę, a następnie dwie liczby są porównywane. –

+2

Tak, masz rację. Mój błąd. – cassln