2012-04-22 17 views
63

Possible Duplicate:
Check if a variable contains a numerical value in Javascript?Ustal, czy wartość JavaScript to "liczba całkowita"?

Jak sprawdzić, czy zmienna jest liczbą całkowitą w jQuery?

Przykład:

if (id == int) { // Do this } 

Im przy użyciu następujących czynności, aby uzyskać identyfikator z URL.

var id = $.getURLParam("id"); 

Ale chcę sprawdzić, czy zmienna jest liczbą całkowitą.

+13

"Duplikat" sprawdza, czy jest to wartość * liczbowa *, a nie, czy jest to * całkowita liczba * wartości. Subtelnie inaczej. –

+0

+1 Nie jest to duplikat, chociaż informacje w innym wydaniu są interesujące i trafne. Wartość liczbowa niekoniecznie jest liczbą całkowitą. – phn

Odpowiedz

152

Spróbuj tego:

if(Math.floor(id) == id && $.isNumeric(id)) 
    alert('yes its an int!'); 

$.isNumeric(id) sprawdza, czy jest to numeryczny lub nie
Math.floor(id) == id następnie ustalić, czy jest to naprawdę w wartości całkowitej, a nie unosić. Jeśli jest to float, parsowanie go do int da inny wynik niż oryginalna wartość. Jeśli jest int, oba będą takie same.

+1

Też podoba mi się to podejście i dałem awans – Marc

+0

To subtelnie nie powiedzie się, jeśli użyjesz typu 'Number' (co jest rzadkie, ale możliwe). –

+0

@ pst Nie sądzę, że masz' Numer' w zmiennej bez ciebie wiedząc o tym fakcie, ale tak, to prawdopodobnie nie byłoby idealnie bezpieczne. – bardiir

23

Użyj metody IsNumeric jQuery.

http://api.jquery.com/jQuery.isNumeric/

if ($.isNumeric(id)) { 
    //it's numeric 
} 

KOREKTA: że nie zapewniają całkowitą. To:

if ((id+"").match(/^\d+$/)) { 
    //it's all digits 
} 

To, oczywiście, nie używa jQuery, ale zakładam jQuery w rzeczywistości nie jest obowiązkowe, o ile rozwiązanie działa

+0

To będzie prawdziwe także dla wartości innych niż int. '$ .isNumeric (3.14) => true' – bardiir

+0

@bardiir, dzięki. Zdałem sobie sprawę, że chwilę przed opublikowaniem i zaktualizował go. – Marc

+0

Jestem teraz nieco ciekawy, co byłoby szybsze, wyrażenie regularne, takie jak Twoja sugestia lub jakikolwiek rzut typu, jak w moim: D – bardiir

47

@bardiir wykorzystuje metodę podobną do sprawdzenia, czy wartość jest numeryczna lub nie. Jednak ta metoda jest znacznie prostsza.

/* 
    I just realized that +n === parseInt(n) won't filter strings. Hence I modified it. At least now it doesn't require any extra function calls. 
*/ 

function isInt(n) { 
    return +n === n && !(n % 1); 
} 

+n wymusza n do liczby. Następnie używamy ścisłej równości (===), aby sprawdzić, czy jest to liczba całkowita. Prosty i wydajny.

Edit: Wydaje się, że wiele osób, trzeba sprawdzić dla typów numerycznych, więc będę dzielić listę funkcji ja regularnie używać do tego celu:

/* 
    -9007199254740990 to 9007199254740990 
*/ 

function isInt(n) { 
    return +n === n && !(n % 1); 
} 

/* 
    -128 to 127 
*/ 

function isInt8(n) { 
    return +n === n && !(n % 1) && n < 0x80 && n >= -0x80; 
} 

/* 
    -32768 to 32767 
*/ 

function isInt16(n) { 
    return +n === n && !(n % 1) && n < 0x8000 && n >= -0x8000; 
} 

/* 
    -2147483648 to 2147483647 
*/ 

function isInt32(n) { 
    return +n === n && !(n % 1) && n < 0x80000000 && n >= -0x80000000; 
} 

/* 
    0 to 9007199254740990 
*/ 

function isUint(n) { 
    return +n === n && !(n % 1) && n >= 0; 
} 

/* 
    0 to 255 
*/ 

function isUint8(n) { 
    return +n === n && !(n % 1) && n < 0x100 && n >= 0; 
} 

/* 
    0 to 65535 
*/ 

function isUint16(n) { 
    return +n === n && !(n % 1) && n < 0x10000 && n >= 0; 
} 

/* 
    0 to 4294967295 
*/ 

function isUint32(n) { 
    return +n === n && !(n % 1) && n < 0x100000000 && n >= 0; 
} 

/* 
    Any number including Infinity and -Infinity but not NaN 
*/ 

function isFloat(n) { 
    return +n === n; 
} 

/* 
    Any number from -3.4028234e+38 to 3.4028234e+38 (Single-precision floating-point format) 
*/ 

function isFloat32(n) { 
    return +n === n && Math.abs(n) <= 3.4028234e+38; 
} 

/* 
    Any number excluding Infinity and -Infinity and NaN (Number.MAX_VALUE = 1.7976931348623157e+308) 
*/ 

function isFloat64(n) { 
    return +n === n && Math.abs(n) <= 1.7976931348623157e+308; 
} 

nadzieję, że to przydatne dla ktoś.

+0

+1 bardzo ładne rozwiązanie! – bardiir

+1

Tak, i działa dla wszystkich możliwych przypadków testowych, w tym 'NaN',' Infinity' i '-Infinity'. –

+0

@AititMShah Podoba mi się. – Marc

Powiązane problemy