Jak sprawdzić, czy zmienna jest liczbą całkowitą w JavaScript i wysłać alert, jeśli nie jest? Próbowałem tego, ale to nie działa:
<html>
<head>
<script type="text/javascript">
var data = 22;
alert(NaN(data));
</script>
</head>
</html>
javascript
JBa
źródło
źródło
parseInt
.Number.isInteger
przy najmniej hackującym sposobie.Odpowiedzi:
Użyj operatora === ( ścisła równość ) jak poniżej,
źródło
2.0 === 2
ponieważ niepotrzebny po przecinku jest po prostu inną reprezentacją tej samej liczby, a zatemparseInt(2.0) === 2.0
odpowiada temu,parseInt(2) === 2
co jest prawdąTo zależy, czy chcesz też rzutować ciągi jako potencjalne liczby całkowite?
To wystarczy:
Z operacjami bitowymi
Prosta analiza i sprawdzenie
Zwarcie i zapisanie operacji parsowania:
A może oba w jednym ujęciu:
Testy:
Oto skrzypce: http://jsfiddle.net/opfyrqwp/28/
Wydajność
Testy wykazały, że rozwiązanie zwarciowe ma najlepszą wydajność (ops / s).
Oto punkt odniesienia: http://jsben.ch/#/htLVw
Jeśli masz ochotę na krótszą, tępą formę zwarcia:
Oczywiście proponuję, aby zajął się tym minizator.
źródło
Zakładając, że nic nie wiesz o omawianej zmiennej, powinieneś przyjąć następujące podejście:
Krótko mówiąc:
źródło
"1.0"
jest ciągiem, a zatem nie jest liczbą. W przeciwnym razie1
będzie wartość zmiennej, jeśli ustawisz ją w ten sposóbvar my_var=1.0;
, która jest poprawnie identyfikowana przez tę funkcję jako liczba całkowita.Number.isInteger()
będzie działać ... do tego czasu jest to dobry sposób na zrobienie tegoNumber.isInteger()
wydaje się być właściwą drogą.MDN dostarczył również następujący polifill dla przeglądarek nieobsługujących
Number.isInteger()
, głównie dla wszystkich wersji IE.Link do strony MDN
źródło
Możesz sprawdzić, czy numer ma resztę:
Pamiętaj, że jeśli wprowadzony tekst może być również tekstem i chcesz najpierw sprawdzić, to nie jest, możesz najpierw sprawdzić typ:
źródło
0 % 1 === 0
w konsoli. Zwracatrue
jako0 % 1
zwroty0
.0 % 1
zwraca0
w trybie zgodności IE9, IE8 i IE7.Możesz użyć prostego wyrażenia regularnego:
źródło
Po pierwsze, NaN jest „liczbą” (tak, wiem, że to dziwne, po prostu z nim walcz), a nie „funkcją”.
Musisz sprawdzić zarówno, czy typ zmiennej jest liczbą, jak i liczbę całkowitą, użyłbym modułu.
źródło
(0 == 0 || 0 % 1 == 0)
oceni dotrue
.0 % 1 == 0
ocenia teżtrue
!%
to nie podział!Zachowaj ostrożność podczas korzystania
pusty ciąg ('') lub wartość logiczna (prawda lub fałsz) zwróci jako liczbę całkowitą. Możesz tego nie chcieć
Number.isInteger (dane)
wbudowana funkcja w przeglądarce. Dosnt obsługuje starsze przeglądarki
Alternatywy:
Jednak Math.round () również zawiedzie w przypadku pustych ciągów znaków i wartości logicznych
źródło
Aby sprawdzić, czy liczba całkowita taka jak plakat chce:
notice + przed danymi (konwertuje ciąg na liczbę), a === dla dokładności.
Oto przykłady:
źródło
return (+data===parseInt(data))
?źródło
Najprostsze i najczystsze rozwiązanie sprzed ECMAScript-6 (które jest również wystarczająco solidne, aby zwrócić wartość false, nawet jeśli do funkcji zostanie przekazana wartość nienumeryczna, taka jak łańcuch lub null):
Działa również następujące rozwiązanie, choć nie tak eleganckie jak powyższe:
Zauważ, że Math.ceil () lub Math.floor () mogą być używane równie dobrze (zamiast Math.round ()) w powyższej implementacji.
Lub alternatywnie:
Jednym dość powszechnym niepoprawnym rozwiązaniem jest:
Chociaż to podejście oparte na analizie składni będzie działało dobrze dla wielu wartości x, gdy x stanie się dość duży, nie będzie działać poprawnie. Problem polega na tym, że parseInt () wymusza swój pierwszy parametr na łańcuch przed analizowaniem cyfr. Dlatego, gdy liczba stanie się wystarczająco duża, jej reprezentacja ciągu zostanie przedstawiona w postaci wykładniczej (np. 1e + 21). W związku z tym parseInt () spróbuje wówczas parsować 1e + 21, ale przestanie analizować, gdy osiągnie znak e, a zatem zwróci wartość 1. Uwaga:
źródło
Dlaczego nikt nie wspomniał
Number.isInteger()
?https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger
Działa idealnie dla mnie i rozwiązuje problem z
NaN
początkiem liczby.źródło
Number.isInteger()
, 3,5 roku przed tobą: stackoverflow.com/a/27424770/5208540W ES6 2 dodano nowe metody dla obiektu liczbowego.
W nim metoda Number.isInteger () zwraca true, jeśli argument jest liczbą całkowitą.
Przykładowe użycie:
źródło
Standard ECMA-262 6.0 (ES6) obejmuje funkcję Number.isInteger .
Aby dodać obsługę starej przeglądarki, zdecydowanie polecam użycie silnego i wspieranego przez społeczność rozwiązania:
https://github.com/paulmillr/es6-shim
która jest biblioteką czystych wypełniaczy JS ES6 .
Zauważ, że ta biblioteka wymaga es5-shim, po prostu postępuj zgodnie z README.md.
źródło
Możesz spróbować,
Number.isInteger(Number(value))
jeśli np.value
Może być liczbą całkowitą w postaci ciągu,var value = "23"
i chcesz to ocenićtrue
. Unikaj prób,Number.isInteger(parseInt(value))
ponieważ nie zawsze zwróci prawidłową wartość. np. jeślivar value = "23abc"
i użyjeszparseInt
implementacji, nadal zwróci wartość true.Ale jeśli chcesz ściśle liczb całkowitych, prawdopodobnie
Number.isInteger(value)
powinieneś załatwić sprawę.źródło
źródło
Sprawdź, czy zmienna jest równa tej samej zmiennej zaokrąglonej do liczby całkowitej, jak poniżej:
źródło
true
naNaN
, po prostu zmienia!=
się!==
i odwracanieif
bloków. DziałaNaN
to, ponieważ jest to jedyna wartość w JavaScript, która nie jest sobie równa. Na przykład nowy kod powinien brzmiećif (Math.round(x) === x) { /* x IS an integer! */ }
Poza tym
Number.isInteger()
. Być możeNumber.isSafeInteger()
jest tu kolejna opcja przy użyciu specyfikacji ES6.Aby wypełnić polifill
Number.isSafeInteger(..)
w przeglądarkach starszych niż ES6:źródło
Number.isInteger()
to najlepszy sposób, jeśli Twoja przeglądarka go obsługuje, jeśli nie, myślę, że jest tak wiele sposobów:lub:
lub:
lub:
teraz możemy przetestować wyniki:
Tak więc wszystkie te metody działają, ale gdy liczba jest bardzo duża, parsowanie i operator ^ nie działałyby dobrze.
źródło
Po prostu spróbuj tego:
źródło
Możesz użyć tej funkcji:
Zwróci true, nawet jeśli wartość jest łańcuchem zawierającym wartość całkowitą.
Tak więc wyniki będą:
źródło
Moje podejście:
a >= 1e+21
Test może przejść tylko dla wartości, która musi być liczbą i bardzo dużą. Z pewnością obejmie to wszystkie przypadki, w przeciwieństwie do innych rozwiązań przedstawionych w tej dyskusji.a === (a|0)
Jeśli argument danej funkcji jest dokładnie (===) taki sam, jak wartość przekształcona bitowo, oznacza to, że argument jest liczbą całkowitą.a|0
zwróci0
dowolną wartość,a
która nie jest liczbą , a jeślia
rzeczywiście jest liczbą, usunie wszystko po przecinku, więc1.0001
stanie się1
źródło
Możesz użyć wyrażenia regularnego w tym celu:
źródło
Od http://www.toptal.com/javascript/interview-questions :
Okazało się, że jest to najlepszy sposób na zrobienie tego.
źródło
Użyj
|
operatora:Tak więc funkcja testowa może wyglądać następująco:
źródło
To rozwiąże jeszcze jeden scenariusz ( 121. ), kropka na końcu
źródło
Dla dodatnich wartości całkowitych bez separatorów:
Testy 1. jeśli nie są puste i 2. jeśli wartość jest równa wynikowi zastąpienia nie-cyfrowego znaku w jej wartości.
źródło
Ok mam minus, bo nie opisałem mojego przykładu, więc więcej przykładów :):
Używam wyrażenia regularnego i metody testowej:
źródło
możesz także spróbować w ten sposób
lub
źródło
data=22.5;
. Także obie gałęzie mająconsole.log("not an integer")
:: SMusiałem sprawdzić, czy zmienna (ciąg lub liczba) jest liczbą całkowitą i użyłem tego warunku:
http://jsfiddle.net/e267369d/1/
Niektóre inne odpowiedzi mają podobne rozwiązanie (polegają na
parseFloat
połączeniu zisNaN
), ale moje powinny być bardziej bezpośrednie i samoobjaśniające.Edycja: dowiedziałem się, że moja metoda zawodzi w przypadku ciągów zawierających przecinek (np. „1,2”) i zdałem sobie również sprawę, że w moim szczególnym przypadku chcę, aby funkcja zawiodła, jeśli ciąg nie jest prawidłową liczbą całkowitą (powinien zawieść na dowolnym zmiennoprzecinkowym , nawet 1,0). Oto moja funkcja Mk II:
http://jsfiddle.net/e267369d/3/
Oczywiście w przypadku, gdy rzeczywiście potrzebujesz funkcji, aby zaakceptować liczby całkowite (1.0 rzeczy), zawsze możesz usunąć warunek kropki
a.indexOf('.') == -1
.źródło