PHP hat eine intval()
Funktion, die einen String in eine Ganzzahl konvertiert. Ich möchte jedoch vorher überprüfen, ob die Zeichenfolge eine Ganzzahl ist, damit ich dem Benutzer eine hilfreiche Fehlermeldung geben kann, wenn sie falsch ist. PHP hatis_int()
, aber das gibt false für string like zurück "2"
.
PHP hat die is_numeric()
Funktion, aber das gibt true zurück, wenn die Zahl doppelt ist. Ich möchte etwas, das für ein Double false zurückgibt, für ein int jedoch true.
z.B:
my_is_int("2") == TRUE
my_is_int("2.1") == FALSE
Antworten:
Wie wäre es mit
ctype_digit
?Aus dem Handbuch:
Das obige Beispiel gibt Folgendes aus:
Dies funktioniert nur, wenn Ihre Eingabe immer eine Zeichenfolge ist:
Wenn Ihre Eingabe vom Typ sein könnte
int
, kombinieren Sie siectype_digit
mitis_int
.Wenn Sie negative Zahlen kümmern, dann müssen Sie die Eingabe für einen vorhergehenden zu überprüfen
-
, und wenn ja, Anrufctype_digit
auf einesubstr
der Eingabezeichenfolge. So etwas würde es tun:quelle
ctype_digit(abs($str))
anstelle von nur hinzuctype_digit
.abs('definitelynotanint') === 0
. außerdemctype_digit
nimmt nur Saitenfilter_var
Sollte es tun:aber
Wenn Sie nur Boolesche Werte als Rückgabewerte möchten, schließen Sie diese in eine Funktion ein, z
quelle
==
vielleicht?if
3v4l.org/IAvCF+1 auf Dominics Antwort (mit
ctype_digit
). Eine andere Möglichkeit besteht darin, den Typ zu erzwingen:quelle
is_int($inty + 0) && is_numeric($inty)
(ich weiß, dass es eine faule Lösung ist, aber für die meisten Absichten und Zwecke funktioniert ...Wirf es auf int. wenn es immer noch den gleichen Wert hat, ist es int;
quelle
return $var == (int) $var;
Quelle .
quelle
elseif
kann nur sein,if
weil Sie bereits in der obigen Anweisung zurückgekehrt sind.$data
es sich um ein Objekt handelt, wird dieses zurückgegebennull
. Besser dasreturn false;
am Ende haben.Hatte in
is_int
letzter Zeit ein Bedürfnis nach einem robusten . Ich fand intval () zu unvorhersehbar:Kam in den Kommentaren der PHP-Dokumentation auf dieses Snippet und deckt nach dem Testen fast alles ab, was Sie darauf werfen:
Aber Vorsicht:
quelle
Eine wirklich saubere Art, die ich gerne benutze, ist diese. Sie haben es zweimal gewirkt, erstens
int
, zweitensstring
, dann streng verglichen===
. Siehe das folgende Beispiel:Über Ihre Funktion my_is_int können Sie nun Folgendes tun:
quelle
quelle
'/^[-+]?[0-9]+$/'
Ich benutze dieses:
quelle
Sie können einfach nach einer Zahl suchen, wenn dies der Fall ist, wird dem Casting ein Doppel gegeben oder nicht:
Nur für positive Zahlen:
Überprüfen Sie es:
Ausgabe:
quelle
Versuche dies:
Funktioniert auch, wenn Ihr $ string Dezimalstellen hat
quelle
Dies wird auch für negative Zahlen sorgen
quelle
quelle
Ich habe einen Weg gefunden, den ich nirgendwo finden konnte, also setze ich ihn hier ein:
Ohne weiteres ist es das:
ctype_digit((string) abs($input))
Beispiel:
Ergebnisse: (sind wie erwartet, nehme ich an)
quelle
Vielleicht nicht die performanteste Art, es zu tun. Aber Sie können es in einer Zeile schreiben.
Wie erwartet:
Erwischt:
quelle
Ein paar Jahre zu spät, aber basierend auf den hier gegebenen Antworten habe ich eine Lösung gefunden, die etwas genauer (insbesondere bei Booleschen Werten) und effizienter (glaube ich) ist als die meisten anderen Antworten:
Arbeiten wie erwartet für diese:
Außer vielleicht für diese 2:
quelle
Wie wäre es mit:
Diese Funktion sollte nur true für eine Zeichenfolgenummer zurückgeben, die mit
(int)
oder in int umgewandelt werden kannintval()
ohne Verlust von mathematischer Bedeutung (z. B. Nicht-Nullen nach dem Dezimalpunkt oder Zahlen außerhalb des Ganzzahlbereichs von PHP) während Dinge akzeptiert werden, die mathematisch nicht signifikant sind (z. B. Leerzeichen, führende Nullen oder nach dem Dezimalpunkt ausschließlich Nullen).Es wird false für,
'10.'
aber nicht für zurückgegeben'10.0'
. Wenn Sie'10.'
wahr sein möchten, können Sie das+
nach dem0
im regulären Ausdruck ändern*
.quelle
Hier ist ein Code, den ich verwendet habe, der gut zu funktionieren scheint und keiner der Probleme hat, die viele der anderen haben.
Die Reihenfolge usw. wird nicht überprüft, ist also nicht für negative Ganzzahlen gedacht, sondern mit einem zusätzlichen Code, der auch mit einigen der anderen Ideen von oben ausgeführt werden kann. Es kann auch angepasst werden, um mit Binär-
array('0', '1')
oder Hexadezimalzahlen usw. zu arbeiten.quelle
Sieh dir das an. Konvertiert $ val in eine Ganzzahl und prüft dann, ob der ursprüngliche $ val, der in eine Zeichenfolge konvertiert wurde, IDENTISCH ist (===) - nur == funktioniert nicht wie erwartet - in die Ganzzahl, die in eine Zeichenfolge konvertiert wurde.
Wenn Sie die Zeichenfolgenwerte nicht überprüfen, funktioniert dies möglicherweise nicht wie erwartet:
Ausgabe:
Selbst wenn Sie hex (0x101010), octal (01) oder eine als float (1.0, 0.0) gespeicherte Ganzzahl verwenden, werden intern alle als float gespeichert. Wenn Sie die Funktion jedoch verwenden, um nach int zu suchen, das als Zeichenfolge gespeichert ist, funktioniert dies.
quelle
quelle
Sie können die folgende Bedingung verwenden. Beachten Sie, dass Sie nicht verwenden sollten! ==
quelle
Es funktioniert perfekt! Hoffe es wird dir hilfreich sein =)
quelle
Wenn Sie wirklich wissen möchten, ob eine Zeichenfolge eine gültige Darstellung eines echten PHP-Integer-Typs ist ...
Dies kann jedoch nicht ausgeführt werden, da der Satz zu groß ist (passt in diesem Fall nicht in den Speicher, wenn Sie stattdessen eine Schleife ausführen, dauert es zu viele CPU-Zyklen).
Sie können möglicherweise eine binäre Suche mit Zeichenfolgenvergleich durchführen, es gibt jedoch bessere Möglichkeiten.
Das einfachste Wesen:
Es gibt einige andere ungewöhnliche Herangehensweisen, wie zum Beispiel:
Sie können auch einen Zeichenfolgenvergleich durchführen, müssen jedoch noch Dinge wie ctype_digit ausführen, überprüfen, ob die Länge angemessen ist (verschwenden Sie keine CPU, bevor Sie Dinge wie ctype_digit ausführen) und mit negativen Zahlen umständlich umgehen.
Beachten Sie, dass filter_var nicht korrekt behauptet, dass eine Zeichenfolge wirklich die Darstellung einer PHP-Ganzzahl ist. Dies ermöglicht ein führendes + und ein umgebendes Leerzeichen.
Intern verwendet PHP die Funktion "_zend_handle_numeric_str" für einen strengen Vergleich, macht dies jedoch nirgendwo direkt verfügbar, daher der Trick mit den Array-Schlüsseln (mit dem eine Zeichenfolge konvertiert wird, die eine PHP-Ganzzahl in eine PHP-Ganzzahl darstellt).
Wenn Sie eine binäre sichere Konvertierung von und nach PHP wünschen, ist dies der richtige Ansatz.
Möglicherweise möchte das nicht jeder, und es kann sich um die Verarbeitung von Benutzereingaben handeln. filter_var ist dafür nicht schlecht und wird in den meisten Fällen für PHP-Neulinge ziemlich sicher sein.
Eine Längenprüfung, ctype_digit und dann eine Prüfung des konvertierten Werts, der sich in einem Bereich befindet, ist auch für Benutzereingaben ziemlich solide. Komplexere Schemata möchten möglicherweise Trimmen oder Regex.
Das Problem bei vielen Antworten hier in dieser Hinsicht ist, dass die Frage zwar vage ist, die Antworten aber nicht sein sollten. Wenn Sie eine Lösung vorschlagen, sollten Sie in der Lage sein, genau zu erklären, was erwartet wird und was nicht. Ohne das ist nicht abzusehen, ob eine Antwort mit einer Frage übereinstimmt oder sicher ist. Das PHP-Handbuch hilft nicht immer, da es nicht alle Einschränkungen für jede der relevanten Methoden erklärt, die es bereitstellt. Dinge wie ctype_digit und is_int sind sehr zuverlässig und leicht zu bearbeiten, aber die Besonderheiten von is_numeric, filter_var und Jonglieren (+ $ var) oder Casting (intval / floatval) sind schlecht dokumentiert.
Dies ist PHP Fudge für Sie. Es gibt eine Vielzahl von Schemata zum Interpretieren von Zeichenfolgen als Ganzzahlen mit Inkonsistenzen. Die strengste Methode zum Überprüfen einer Ganzzahlzeichenfolge ist für den Benutzer nicht direkt verfügbar.
quelle
Wenn Sie numerische IDs von MySQL verarbeiten und versuchen, eine Validierung für eine gültige Nicht-Null- Int oder ein
int
Aber im Zeichenfolgenformat ( da MySQL immer alles im Zeichenfolgenformat zurückgibt ) und nicht zu erzwingenNULL
. Sie können Folgendes verwenden. Dies ist der fehler-, warnungs- und hinweisungssicherste Weg, nur das zuzulassen,int/string-ints
was ich gefunden habe.quelle
Hier ist eine einfache Lösung, die is_numeric , floatval und intval verwendet :
Ergebnisse:
Beachten Sie, dass Werte größer als PHP_INT_MAX möglicherweise false zurückgeben.
quelle
Könnte entweder is_numeric () verwenden und dann prüfen, ob "." in der Saite (allerdings nicht besonders kulturempfindlich).
Alternativ können Sie is_numeric () verwenden und dann in ein Double umwandeln und prüfen, ob $ var == floor ($ var) (sollte true zurückgeben, wenn es sich um eine Ganzzahl handelt).
quelle