PHP ma intval()
funkcję, która konwertuje ciąg znaków na liczbę całkowitą. Jednak chcę wcześniej sprawdzić, czy łańcuch jest liczbą całkowitą, aby móc przekazać użytkownikowi pomocny komunikat o błędzie, jeśli jest nieprawidłowy. PHP ma is_int()
, ale zwraca false dla łańcucha znaków, takiego jak "2"
.
PHP ma tę is_numeric()
funkcję, ale zwróci ona wartość true, jeśli liczba jest podwójna. Chcę czegoś, co zwróci fałsz dla podwójnej, ale prawdziwe dla int.
na przykład:
my_is_int("2") == TRUE
my_is_int("2.1") == FALSE
Odpowiedzi:
A co powiesz na używanie
ctype_digit
?Z instrukcji:
Powyższy przykład wyświetli:
Działa to tylko wtedy, gdy dane wejściowe są zawsze ciągiem znaków:
Jeśli dane wejściowe mogą być typu
int
, połącz jectype_digit
zis_int
.Jeśli dbasz o liczbach ujemnych, następnie trzeba sprawdzić wejście do poprzedzającego
-
, a jeśli tak, to wezwaniectype_digit
na zasadziesubstr
łańcucha wejściowego. Coś takiego mogłoby to zrobić:źródło
ctype_digit(abs($str))
zamiast po prostuctype_digit
.abs('definitelynotanint') === 0
. co więcej,ctype_digit
trwa tylko smyczkifilter_var
powinien to zrobić:ale
Jeśli chcesz, aby wartości logiczne były tylko zwracane, opakuj je w funkcję, np
źródło
==
być może?if
3v4l.org/IAvCF+1 do odpowiedzi Dominica (używanie
ctype_digit
). Innym sposobem, w jaki możesz to zrobić, jest wymuszenie typu:źródło
is_int($inty + 0) && is_numeric($inty)
(wiem, że jest to leniwe rozwiązanie, ale działa w większości zamiarów i celów ...Prześlij na int. jeśli nadal ma tę samą wartość to int;
źródło
return $var == (int) $var;
Źródło .
źródło
elseif
może być po prostuif
dlatego, że już wróciłeś w oświadczeniu powyżej.$data
jest obiektem, to zwrócinull
. Lepiej miećreturn false;
na końcu.is_int
Ostatnio potrzebowałem solidnego . Uważam, że intval () jest zbyt nieprzewidywalny:Przeszedłem przez ten fragment w komentarzach do dokumentacji PHP, a po przetestowaniu obejmuje on prawie wszystko, co do niego wrzucisz:
Ale uważaj:
źródło
Jednym naprawdę czystym sposobem, którego lubię, jest ten. Rzucasz to dwukrotnie, najpierw do
int
środka, po drugie do środkastring
, a następnie do ścisłego porównania===
. Zobacz poniższy przykład:A teraz o twojej funkcji my_is_int, możesz zrobić coś takiego:
źródło
źródło
'/^[-+]?[0-9]+$/'
Używam tego:
źródło
Możesz po prostu sprawdzić liczbę, jeśli jest, to sprawdź, czy rzucanie ma podwójne, czy nie:
Tylko dla liczb dodatnich:
Sprawdzanie:
Wynik:
źródło
Spróbuj tego:
Działa również, jeśli twój ciąg $ ma miejsca dziesiętne
źródło
To zajmie się również liczbą ujemną
źródło
źródło
Wymyśliłem sposób, którego nie mogłem nigdzie znaleźć, więc umieszczam go tutaj:
Bez zbędnych ceregieli jest to:
ctype_digit((string) abs($input))
Przykład:
Wyniki: (przypuszczam, że są zgodne z oczekiwaniami)
źródło
Może nie jest to najlepszy sposób na zrobienie tego. Ale możesz napisać to w jednej linii.
Zgodnie z oczekiwaniami:
Mam cię:
źródło
Kilka lat później, ale na podstawie udzielonych tutaj odpowiedzi wymyśliłem rozwiązanie, które jest nieco dokładniejsze (szczególnie w przypadku wartości logicznych) i wydajniejsze (myślę) niż większość innych odpowiedzi:
Działa zgodnie z oczekiwaniami dla tych:
Może z wyjątkiem tych 2:
źródło
Co powiesz na:
Ta funkcja powinna zwracać prawdę tylko dla dowolnej liczby ciągu, która może być rzutowana na int z
(int)
lubintval()
bez utraty czegokolwiek o znaczeniu matematycznym (np. Niezerowych po przecinku lub liczb poza zakresem liczb całkowitych PHP), akceptując rzeczy, które nie są matematycznie istotne (np. białe spacje, zera wiodące lub, po przecinku, wyłącznie zera).Zwróci fałsz dla,
'10.'
ale nie dla'10.0'
. Jeśli chcesz,'10.'
aby była prawdziwa, możesz zmienić+
po0
znaku w wyrażeniu regularnym na*
.źródło
Oto kod, którego użyłem, który wydaje się działać dobrze i nie ma żadnych problemów, które występują w wielu innych.
Nie sprawdza kolejności itp., Więc nie jest przeznaczony dla ujemnych liczb całkowitych, ale z dodatkowym kodem, który można również zrobić przy użyciu innych pomysłów z góry. Może być również przystosowany do pracy z liczbami binarnymi
array('0', '1')
lub szesnastkowymi itp.źródło
Zobacz. Konwertuje wartość $ val na liczbę całkowitą, a następnie sprawdza, czy oryginalna wartość $ val przekonwertowana na łańcuch jest IDENTYCZNA (===) - po prostu == nie będzie działać zgodnie z oczekiwaniami - na liczbę całkowitą val zamienioną na łańcuch.
Jeśli nie sprawdzisz wartości ciągów, może to nie działać zgodnie z oczekiwaniami:
Wynik:
Powodem jest to, że nawet jeśli używasz liczby szesnastkowej (0x101010), ósemkowej (01) lub liczby całkowitej przechowywanej jako zmiennoprzecinkowa (1,0, 0,0), wewnętrznie wszystkie są przechowywane jako zmiennoprzecinkowe. Jeśli jednak użyjesz funkcji do sprawdzenia int przechowywanego jako ciąg, zadziała.
źródło
źródło
Możesz użyć następującego warunku. Zauważ, że nie powinieneś używać! ==
źródło
Działa idealnie! Mam nadzieję, że będzie ci to pomocne =)
źródło
Jeśli chcesz naprawdę wiedzieć, czy łańcuch jest prawidłową reprezentacją prawdziwej liczby całkowitej PHP ...
Jednak nie można tego uruchomić, ponieważ zestaw jest zbyt duży (w tym przypadku nie zmieści się w pamięci, jeśli zamiast tego wykonasz pętlę, zajmie to zbyt wiele cykli procesora).
Być może możesz przeprowadzić wyszukiwanie binarne z porównaniem ciągów, jednak są lepsze sposoby.
Najprostsza istota:
Istnieją inne nietypowe sposoby podejścia do tego problemu, takie jak:
Możesz także porównać ciągi znaków, ale nadal będziesz musiał zrobić takie rzeczy, jak ctype_digit, sprawdzić, czy długość jest rozsądna (nie marnuj procesora przed wykonaniem takich rzeczy, jak ctype_digit) i trochę niezręcznej obsługi liczb ujemnych.
Zauważ, że zmienna filter_var nie zapewnia poprawnie, że łańcuch jest autentyczną reprezentacją liczby całkowitej PHP. Umożliwi to wiodący znak + i otaczające go białe znaki.
Wewnętrznie PHP używa funkcji "_zend_handle_numeric_str" do ścisłego porównania, ale nigdzie nie ujawnia tego bezpośrednio, stąd sztuczka z użyciem kluczy tablicowych (która używa jej do konwersji dowolnego ciągu będącego reprezentacją liczby całkowitej PHP na liczbę całkowitą PHP).
Jeśli chcesz, aby konwersja plików binarnych do iz PHP była bezpieczna, to jest to podejście.
Nie każdy może tego chcieć i może to być przypadek obsługi danych wejściowych użytkownika. filter_var nie jest na to zły i będzie całkiem bezpieczny w większości przypadków dla osób, które nie znają PHP.
Sprawdzenie długości, ctype_digit, a następnie sprawdzenie przekonwertowanej wartości, czy znajduje się w zakresie, jest również dość solidne dla danych wejściowych użytkownika. Bardziej złożone schematy mogą wymagać trim lub regex.
Problem z wieloma odpowiedziami tutaj w tym względzie polega na tym, że chociaż pytanie jest niejasne, odpowiedzi nie powinny być. Jeśli masz zamiar zaproponować rozwiązanie, powinieneś być w stanie dokładnie wyjaśnić, co będzie, a czego nie będziesz się spodziewać. Bez tego nie wiadomo, czy odpowiedź pasuje do pytania, czy jest bezpieczna. Podręcznik PHP nie zawsze pomaga, ponieważ nie wyjaśnia wszystkich zastrzeżeń dotyczących każdej z odpowiednich metod, które dostarcza. Rzeczy takie jak ctype_digit i is_int są bardzo niezawodne i łatwe do odczytania, ale szczegóły dotyczące is_numeric, filter_var i juggling (+ $ var) lub rzutowania (intval / floatval) są słabo udokumentowane.
To jest krówka PHP dla Ciebie. Ma niezliczoną liczbę schematów do interpretacji ciągów znaków jako liczb całkowitych, z niespójnościami. Najbardziej rygorystyczna metoda sprawdzania poprawności łańcucha liczb całkowitych nie jest bezpośrednio ujawniana użytkownikowi.
źródło
Jeśli obsługujesz identyfikatory numeryczne z mysql i próbujesz narzucić walidację, aby była to poprawna wartość int niezerowa lub an,
int
ale w formacie ciągu ( ponieważ mysql zawsze zwraca wszystko w formacie ciągu ), a nieNULL
. Możesz użyć następujących. Jest to najbardziej odporny na błędy / ostrzeżenie / powiadomienie sposób zezwalania tylko na te,int/string-ints
które znalazłem.źródło
Oto proste rozwiązanie, które wykorzystuje is_numeric , floatval i intval :
Wyniki:
Zauważ, że wartości większe niż PHP_INT_MAX mogą zwracać fałsz.
źródło
Można użyć is_numeric (), a następnie sprawdzić obecność „.” w ciągu (choć nie jest szczególnie wrażliwa na kulturę).
Alternatywnie użyj is_numeric (), a następnie rzutuj na double i zobacz, czy $ var == floor ($ var) (powinno zwrócić true, jeśli jest to liczba całkowita).
źródło