Mam nadzieję, że jest coś w tej samej przestrzeni koncepcyjnej co stara IsNumeric()
funkcja VB6 ?
javascript
validation
numeric
Electrons_Ahoy
źródło
źródło
isNaN("")
,isNaN(" ")
,isNaN(false)
, zwroty itpfalse
dla nich, co oznacza, że są one liczbami.Odpowiedzi:
Aby sprawdzić, czy zmienna (w tym ciąg) jest liczbą, sprawdź, czy nie jest liczbą:
Działa to niezależnie od tego, czy zawartość zmiennej jest łańcuchem, czy liczbą.
Przykłady
Oczywiście możesz to zanegować, jeśli potrzebujesz. Na przykład, aby zaimplementować podany
IsNumeric
przykład:Aby przekonwertować ciąg zawierający liczbę na liczbę:
Działa tylko, jeśli ciąg zawiera tylko znaki numeryczne, w przeciwnym razie zwraca
NaN
.Przykłady
Aby przekonwertować ciąg luźno na liczbę
Przydatny do konwersji „12px” na 12, na przykład:
Przykłady
Pływaki
Należy pamiętać, że w przeciwieństwie
+num
,parseInt
(jak sama nazwa wskazuje) będzie przekonwertować pływaka do liczby całkowitej przez odcięcie wszystkiego po przecinku (jeśli chcesz korzystaćparseInt()
z powodu tego zachowania, jesteś zapewne lepiej wyłączyć za pomocą innej metody zamiast ) :Puste łańcuchy
Puste łańcuchy mogą być nieco sprzeczne z intuicją.
+num
konwertuje puste ciągi lub ciągi ze spacjami na zero iisNaN()
przyjmuje to samo:Ale
parseInt()
nie zgadza się:źródło
isNaN
„Aby sprawdzić, czy zmienna nie jest liczbą”. „not a number” to nie to samo co „IEEE-794 NaN”, na co sięisNaN
sprawdza. W szczególności to użycie kończy się niepowodzeniem, przynajmniej podczas testowania wartości logicznych i pustych ciągów. Zobacz developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… .var n = 'a'; if (+n === +n) { // is number }
Jest to ~ 3994% szybsze niż isNaN w najnowszej wersji Chrome. Zobacz test wydajności tutaj: jsperf.com/isnan-vs-typeof/5isNaN(1 + false + parseInt("1.do you trust your users?"))
I możesz przejść w RegExp:
źródło
Jeśli próbujesz tylko sprawdzić, czy ciąg jest liczbą całkowitą (bez miejsc dziesiętnych), regex jest dobrym sposobem. Inne metody
isNaN
są zbyt skomplikowane dla czegoś tak prostego.Aby zezwolić tylko na dodatnie liczby całkowite, użyj tego:
źródło
/^-?\d+$/
dobrze?Jeśli naprawdę chcesz, aby upewnić się, że ciąg zawiera tylko numer, dowolną liczbę (całkowitej lub zmiennoprzecinkową), a dokładnie numeru, to nie można używać
parseInt()
/parseFloat()
,Number()
albo!isNaN()
przez samych siebie. Zauważ, że!isNaN()
tak naprawdę zwraca,true
kiedyNumber()
zwróci liczbę, afalse
kiedy wróciNaN
, więc wykluczę ją z dalszej dyskusji.Problem
parseFloat()
polega na tym, że zwróci liczbę, jeśli ciąg zawiera dowolną liczbę, nawet jeśli ciąg nie zawiera tylko i dokładnie liczby:Problem
Number()
polega na tym, że zwraca liczbę w przypadkach, gdy przekazana wartość wcale nie jest liczbą!Problem z rzutowaniem własnego wyrażenia regularnego polega na tym, że dopóki nie utworzysz dokładnego wyrażenia regularnego w celu dopasowania liczby zmiennoprzecinkowej, ponieważ JavaScript rozpozna go, przegapisz przypadki lub rozpoznasz przypadki, w których nie powinieneś. A nawet jeśli potrafisz stworzyć własne wyrażenie regularne, dlaczego? Istnieją prostsze wbudowane sposoby, aby to zrobić.
Okazuje się jednak, że
Number()
(iisNaN()
) robi to dobrze w każdym przypadku, gdyparseFloat()
zwraca liczbę, gdy nie powinna, i na odwrót. Aby dowiedzieć się, czy łańcuch jest naprawdę dokładnie i tylko liczbą, wywołaj obie funkcje i sprawdź, czy oba zwracają wartość true:źródło
' 1'
,'2 '
A' 3 '
wszystko return true.isNumber
funkcji, nie ma do czynienia z interfejsami użytkownika. Również dobre wprowadzanie liczb nie pozwoli na rozpoczęcie spacji.Przyjęta odpowiedź na to pytanie ma kilka wad (podkreślonych przez kilku innych użytkowników). Jest to jeden z najprostszych i sprawdzonych sposobów podejścia do tego w javascript:
Poniżej kilka dobrych przypadków testowych:
źródło
Wypróbuj funkcję isNan :
źródło
isNaN()
powracafalse
do JAKIEGOKOLWIEK ciąg znaków zawierające tylko białe znaki, w tym takie rzeczy jak „\ u00A0”.Stare pytanie, ale w podanych odpowiedziach brakuje kilku punktów.
Notacja naukowa.
!isNaN('1e+30')
jesttrue
jednak w większości przypadków, gdy ludzie pytają o liczby, nie chcą dopasowywać takich rzeczy1e+30
.Duże liczby zmiennoprzecinkowe mogą zachowywać się dziwnie
Obserwuj (używając Node.js):
Z drugiej strony:
Tak więc, jeśli się tego spodziewasz
String(Number(s)) === s
, lepiej ogranicz swoje łańcuchy maksymalnie do 15 cyfr (po pominięciu zer wiodących).Nieskończoność
Biorąc to wszystko pod uwagę, sprawdzanie, czy podany ciąg jest liczbą spełniającą wszystkie poniższe kryteria:
Number
i powrót doString
nie jest takie łatwe zadanie. Oto prosta wersja:
Jednak nawet ten jest daleki od ukończenia. Zera wiodące nie są tutaj obsługiwane, ale wkręcają test długości.
źródło
Przetestowałem i rozwiązanie Michaela jest najlepsze. Głosuj na jego odpowiedź powyżej (wyszukaj na tej stronie „Jeśli naprawdę chcesz się upewnić, że ciąg znaków”, aby go znaleźć). Zasadniczo jego odpowiedź brzmi:
Działa dla każdego przypadku testowego, który tutaj udokumentowałem: https://jsfiddle.net/wggehvp9/5/
Wiele innych rozwiązań zawodzi w tych przypadkach na krawędziach: „”, null, „”, true i []. Teoretycznie można ich używać z odpowiednią obsługą błędów, na przykład:
lub
ze specjalną obsługą dla / \ s /, null, "", true, false, [] (i innych?)
źródło
Można użyć wynik Ilość przechodząc argument do jego konstruktora.
Jeśli argument (ciąg znaków) nie może zostać przekonwertowany na liczbę, zwraca NaN, więc można określić, czy podany ciąg był poprawną liczbą, czy nie.
Uwagi: Uwaga podczas mijania lub pusty ciąg
'\t\t'
i'\n\t'
tak Ilość powróci 0; Przekazanie true zwróci 1, a false zwróci 0.źródło
Number
Konstruktor jest dokładnie taka sama jak+x
.Number()
obsługuje również liczby zmiennoprzecinkowe, jakNumber.parseFloat()
nieNumber.parseInt()
Być może jedna lub dwie osoby napotykają to pytanie, które wymagają znacznie bardziej rygorystycznej kontroli niż zwykle (tak jak ja). W takim przypadku może to być przydatne:
Strzec się! Będzie to odrzucić sznurki jak
.1
,40.000
,080
,00.1
. Jest bardzo wybredny - ciąg musi pasować do „ najbardziej minimalnej idealnej formy ” liczby, aby ten test mógł przejść pomyślnie.Używa konstruktora
String
iNumber
do rzutowania łańcucha na liczbę iz powrotem, a tym samym sprawdza, czy „idealna minimalna forma” silnika JavaScript (ta, na którą został przekonwertowany za pomocą początkowegoNumber
konstruktora) odpowiada oryginalnemu ciągowi.źródło
(str === String(Math.round(Number(str))))
."Infinity"
,"-Infinity"
i"NaN"
zdać ten test. Można to jednak naprawić za pomocą dodatkowegoNumber.isFinite
testu.str === ("" + +str)
. Zasadniczo sprawdza, czy ciąg jest wynikiem strunowania numeru JS. Wiedząc o tym, możemy również zobaczyć problem: test zalicza się,0.000001
ale nie0.0000001
zalicza się, czyli wtedy, gdy1e-7
przechodzi. To samo dotyczy bardzo dużych liczb.parseInt (), ale należy pamiętać, że ta funkcja jest nieco inna w tym sensie, że zwraca na przykład 100 dla parseInt („100px”).
źródło
parseInt(09)
.paraseInt(09, 10)
, 10
argumentu.parseInt('09')
wynosi teraz 9.Zacytować:
nie jest do końca prawdą, jeśli musisz sprawdzić początkowe / końcowe spacje - na przykład, gdy wymagana jest pewna liczba cyfr, i musisz, powiedzmy, „1111”, a nie „111” lub „111”, być może kod PIN Wejście.
Lepszy w użyciu:
źródło
'-1'
,'0.1'
i'1e10'
wszystkie fałszywe zamian. Ponadto wartości większe niż dodatnia nieskończoność lub mniejsze niż ujemna nieskończoność zwracają wartość true, podczas gdy prawdopodobnie powinny zwracać wartość false.Dlaczego implementacja jQuery nie jest wystarczająco dobra?
Michael zasugerował coś takiego (chociaż ukradłem tutaj „user1691651 - John” zmienioną wersję tutaj):
Poniżej przedstawiono rozwiązanie, które najprawdopodobniej ma niską wydajność, ale dobre wyniki. Jest to urządzenie wykonane z implementacji jQuery 1.12.4 i odpowiedzi Michaela, z dodatkowym sprawdzaniem początkowych / końcowych spacji (ponieważ wersja Michaela zwraca wartość true dla liczb z wiodącymi / końcowymi spacjami):
Ta ostatnia wersja ma jednak dwie nowe zmienne. Można obejść jedną z nich, wykonując:
Nie testowałem żadnego z nich zbyt wiele, w inny sposób niż ręczne testowanie kilku przypadków użycia, które uderzam z moim obecnym trudem, który jest bardzo standardowy. Jest to sytuacja „stojąca na ramionach gigantów”.
źródło
Nie jest poprawny dla TypeScript, ponieważ:
declare function isNaN(number: number): boolean;
W przypadku TypeScript możesz użyć:
/^\d+$/.test(key)
źródło
Używam tego, który zrobiłem ...
Dotychczas działał:
Jeśli zauważysz jakiś problem, powiedz mi, proszę.
źródło
return !isNaN(parseInt(value, 10));
Jeśli ktokolwiek kiedykolwiek znajdzie się tak daleko, spędziłem trochę czasu włamując się do tego, próbując załatać moment.js ( https://github.com/moment/moment ). Oto coś, co mu zabrałem:
Obsługuje następujące przypadki:
Prawdziwe! :
Fałszywe! :
Jak na ironię, z którą walczę najbardziej:
Wszelkie sugestie są mile widziane. :]
źródło
isNumeric(' ')
iisNumeric('')
?&& (val.replace(/\s/g,'') !== '') //Empty && (val.slice(-1) !== '.') //Decimal without Number
, aby rozwiązać wyżej wymieniony problem i taki, który miałem sam.Używając zwykłego JavaScript:
Korzystanie z Lodash:
źródło
źródło
2019: W tym przykłady ES3, ES6 i TypeScript
Może to zostało przerobione zbyt wiele razy, jednak dzisiaj również z tym walczyłem i chciałem opublikować moją odpowiedź, ponieważ nie widziałem żadnej innej odpowiedzi, która robi to tak prosto lub dokładnie:
ES3
ES6
Maszynopis
Wydaje się to dość proste i obejmuje wszystkie podstawy, które widziałem na wielu innych postach i wymyśliłem:
Możesz również wypróbować własną
isNumeric
funkcję i po prostu przeoczyć te przypadki użycia i wyszukać dla wszystkich z nich „prawda”.Lub, aby zobaczyć wartości, które zwracają:
źródło
2019: Praktyczna i ścisła numeryczna kontrola ważności
Często „poprawna liczba” oznacza liczbę Javascript bez NaN i nieskończoności, tj. „Liczbę skończoną”.
Aby sprawdzić poprawność liczbową wartości (na przykład z zewnętrznego źródła), możesz zdefiniować styl ESlint Airbnb:
i użyj tego w ten sposób:
źródło
PFB działające rozwiązanie:
źródło
Zaoszczędź sobie bólu głowy związanego z próbą znalezienia „wbudowanego” rozwiązania.
Nie ma dobrej odpowiedzi, a bardzo pozytywna odpowiedź w tym wątku jest błędna.
npm install is-number
źródło
Niedawno napisałem artykuł o sposobach zapewnienia, że zmienna jest poprawną liczbą: https://github.com/jehugaleahsa/artifacts/blob/master/2018/typescript_num_hack.md Artykuł wyjaśnia, jak zapewnić zmiennoprzecinkową lub całkowitą liczbę, jeśli to jest ważne (
+x
vs~~x
).W artykule założono, że zmienna jest na początku a
string
lub anumber
itrim
jest dostępna / wypełniona. Nie byłoby trudno rozszerzyć go na inne typy. Oto jego mięso:źródło
Moja próba nieco mylącego, być może nie najlepsze rozwiązanie
źródło
042
) i szesnastkowa (0x45f
)W mojej aplikacji dopuszczamy tylko znaki AZ AZ i 0–9. Znalazłem powyższą odpowiedź przy użyciu „ ciąg % 1 === 0” zadziałał, chyba że ciąg zaczął się od 0xnn (jak 0x10), a następnie zwróciłby go jako wartość liczbową, gdy nie chcieliśmy. Następująca prosta pułapka w mojej kontroli numerycznej wydaje się załatwić sprawę w naszych konkretnych przypadkach.
Ostrzeżenie : to może wykorzystywać długotrwały błąd w JavaScript i ActionScript [Number ("1" + the_string)% 1 === 0)], nie mogę za to mówić, ale jest to dokładnie to, czego potrzebowaliśmy.
źródło
% 1
na nich operację numeryczną ), a to interpretuje ciąg jako literę szesnastkową lub zmiennoprzecinkową.Moje rozwiązanie:
Możesz dodać dodatkowe warunki wewnątrz pętli, aby dopasować je do konkretnych potrzeb.
źródło
Możesz użyć typów, takich jak w bibliotece przepływów y, aby uzyskać statyczne sprawdzanie czasu kompilacji. Oczywiście nie jest to szczególnie przydatne do wprowadzania danych przez użytkownika.
źródło
Oto linijka służąca do sprawdzenia, czy
sNum
jest poprawną wartością liczbową; został przetestowany pod kątem szerokiej gamy danych wejściowych:źródło
Wystarczy użyć
isNaN()
, to przekształci ciąg na liczbę, a jeśli uzyska prawidłowy numer , zwrócifalse
...źródło
Używam następujących:
źródło
1..1
,1,1
,-32.1.12
, i co ważniejsze, nie powiedzie sięundefined
iNaN
. Jeśli zdałeśundefined
lubNaN
że to zwróci ci fałszywie pozytywne powiedzenie, że to liczba.