Ich möchte, dass der einfachste ausfallsichere Test überprüft, ob eine Zeichenfolge in JavaScript eine positive Ganzzahl ist.
isNaN(str)
Gibt true für alle Arten von Nicht-Integer-Werten zurück und parseInt(str)
gibt Integer für Float-Strings wie "2.5" zurück. Und ich möchte auch kein jQuery-Plugin verwenden müssen.
javascript
Mick Byrne
quelle
quelle
isNaN()
Funktion verhält sich so, wie sie es tut, da das KonzeptNot a Number
in der Gleitkommaspezifikation nach IEEE 794 eine sehr spezifische Bedeutung hat. Es ist nicht beabsichtigt, eine Antwort auf die einfache umgangssprachliche Frage zu geben: "Ist dieser Wert keine Zahl?"٢٣٤
oderMCMXIX
sind beide gültige Ganzzahldarstellungen, aber ich glaube nicht, dass Sie nach einem Code suchen, der diese analysieren kann. Könnten Sie angeben, welche Zahlenformate Sie unterstützen möchten, da die Leute darüber verwirrt zu sein scheinen?Antworten:
Zwei Antworten für Sie:
Basierend auf dem Parsen
Regulären Ausdruck
Beachten Sie, dass ich in beiden Fällen "positive Ganzzahl" als eingeschlossen interpretiert habe
0
, obwohl dies0
nicht positiv ist. Ich füge Notizen hinzu, wenn Sie nicht zulassen möchten0
.Basierend auf Parsing
Wenn Sie möchten, dass es sich um eine normalisierte dezimale Ganzzahlzeichenfolge über einen angemessenen Wertebereich handelt, können Sie Folgendes tun:
oder wenn Sie Leerzeichen und führende Nullen zulassen möchten:
Live-Testbed (ohne Behandlung von führenden Nullen oder Leerzeichen):
Code-Snippet anzeigen
Live-Testbed ( mit Behandlung für führende Nullen und Leerzeichen):
Code-Snippet anzeigen
Wenn Sie nicht zulassen möchten
0
, wechseln Sie einfach>= 0
zu> 0
. (Oder entfernen Sie in der Version, die führende Nullen zulässt, die|| "0"
in derreplace
Zeile.)Wie das funktioniert:
In der Version, die Leerzeichen und führende Nullen zulässt:
str = str.trim();
Entfernt alle führenden und nachfolgenden Leerzeichen.if (!str)
fängt eine leere Zeichenfolge ab und kehrt zurück, was keinen Sinn macht, den Rest der Arbeit zu erledigen.str = str.replace(/^0+/, "") || "0";
Entfernt alle führenden Nullen aus der Zeichenfolge. Wenn dies jedoch zu einer leeren Zeichenfolge führt, wird eine einzelne 0 wiederhergestellt.Number(str)
: Instr
eine Zahl konvertieren ; Die Zahl kann durchaus einen Bruchteil haben oder seinNaN
.Math.floor
: Schneiden Sie die Zahl ab (hackt einen Bruchteil ab).String(...)
: Konvertiert das Ergebnis zurück in eine normale Dezimalzeichenfolge. Für wirklich große Zahlen wird dies in die wissenschaftliche Notation gehen, was diesen Ansatz brechen kann. (Ich weiß nicht genau, wo die Aufteilung ist, die Details sind in der Spezifikation enthalten , aber für ganze Zahlen glaube ich, dass es an dem Punkt ist, an dem Sie 21 Stellen überschritten haben [zu diesem Zeitpunkt ist die Zahl sehr ungenau geworden, wie IEEE-754 Zahlen mit doppelter Genauigkeit haben nur ungefähr 15 Stellen Genauigkeit.)... === str
: Vergleicht das mit der ursprünglichen Zeichenfolge.n >= 0
: Überprüfen Sie, ob es positiv ist.Beachten Sie, dass dies für die Eingabe fehlschlägt, für
"+1"
jede Eingabe in wissenschaftlicher Notation, die zu diesemString(...)
Zeitpunkt nicht wieder in dieselbe wissenschaftliche Notation umgewandelt wird , und für jeden Wert, den die Art der von JavaScript verwendeten Zahl verwendet (binärer Gleitkomma mit doppelter Genauigkeit nach IEEE-754). kann nicht genau darstellen, welche Analyse näher an einem anderen Wert als dem angegebenen liegt (der viele ganze Zahlen über 9.007.199.254.740.992 enthält; zum Beispiel1234567890123456789
wird fehlschlagen). Ersteres ist eine einfache Lösung, die beiden letzteren nicht so sehr.Regulären Ausdruck
Der andere Ansatz besteht darin, die Zeichen der Zeichenfolge über einen regulären Ausdruck zu testen, wenn Ihr Ziel darin besteht, nur eine Option
+
gefolgt von einer0
oder einer Zeichenfolge im normalen Dezimalformat zuzulassen (z. B.) :Live-Testumgebung:
Code-Snippet anzeigen
Wie das funktioniert:
^
: Match Anfang der Zeichenfolge\+?
: Erlaube eine einzelne, optionale+
(entferne diese, wenn du nicht willst)(?:...|...)
: Erlauben Sie eine dieser beiden Optionen (ohne eine Erfassungsgruppe zu erstellen):(0|...)
: Allein zulassen0
...(...|[1-9]\d*)
: ... oder eine Zahl, die mit etwas anderem als0
und gefolgt von einer beliebigen Anzahl von Dezimalstellen beginnt .$
: Match Ende der Zeichenfolge.Wenn Sie nicht zulassen möchten
0
(weil es nicht positiv ist), wird der reguläre Ausdruck gerecht/^\+?[1-9]\d*$/
(z. B. können wir die Abwechslung verlieren, die wir zulassen mussten0
).Wenn Sie führende Nullen (0123, 00524) zulassen möchten, ersetzen Sie einfach den Wechsel
(?:0|[1-9]\d*)
durch\d+
Wenn Sie Leerzeichen zulassen möchten, fügen Sie diese
\s*
direkt nach^
und\s*
kurz vor hinzu$
.Hinweis für die Umrechnung in eine Zahl: Bei modernen Motoren wäre es wahrscheinlich in Ordnung, sie zu verwenden
+str
oderNumber(str)
zu tun, aber ältere Motoren erweitern diese möglicherweise auf eine nicht standardmäßige (aber früher zulässige) Weise, die besagt, dass eine führende Null Oktal bedeutet (Basis 8), z. B. "010" => 8. Sobald Sie die Zahl validiert haben, können Sie sicherparseInt(str, 10)
sicherstellen, dass sie als Dezimalzahl analysiert wird (Basis 10).parseInt
würde den Müll am Ende des Strings ignorieren, aber wir haben sichergestellt, dass es keinen mit dem regulären Ausdruck gibt.quelle
Number(' ')
undNumber('')
return0
while solltenNaN
stattdessen zurückkehren.parseInt
kehrt zurück2
./\D/.test('2a')
ist wahr (weil es eine nicht-Ziffer gibt). Also vielleichtif (!/\D/.test(str) && !isNan((num = parseInt(str, 10))) { /* Valid number in num */}
... ganz oben auf meinem Kopf ...Lösung 1
Wenn wir betrachten eine JavaScript - Integer - Wert von maximal zu sein
4294967295
(dhMath.pow(2,32)-1
), dann wird die folgende kurze Lösung wird perfekt funktionieren:BESCHREIBUNG:
123.45 >>> 0 === 123
-1 >>> 0 === 4294967295
MAX_INT
1e10 >>> 0 === 1410065408
1e7 >>> 0 === 10000000
parseFloat
korrigiert das Parsen von Zeichenfolgenummern (EinstellungNaN
für nicht numerische Zeichenfolgen)TESTS:
DEMO: http://jsfiddle.net/5UCy4/37/
Lösung 2
Ein anderer Weg ist gut für alle numerischen Werte, die bis
Number.MAX_VALUE
zu ungefähr gültig sind , dh bis ungefähr1.7976931348623157e+308
:BESCHREIBUNG:
!isNaN(parseFloat(n))
verwendet wird , filtern reine Stringwerte, beispielsweise""
," "
,"string"
;0 <= ~~n
Filter negativ und groß nicht ganzzahlige Werte, zum Beispiel"-40.1"
,"129000098131766699"
;(!isNaN(parseFloat(n)) && 0 <= ~~n)
Gibt zurück,true
wenn der Wert sowohl numerisch als auch positiv ist .0 === n % (...)
prüft, ob der Wert nicht float ist - hier(...)
(siehe 3) wird wie0
im Fall vonfalse
und wie1
im Fall von ausgewertettrue
.TESTS:
DEMO: http://jsfiddle.net/5UCy4/14/
Die vorherige Version:
DEMO: http://jsfiddle.net/5UCy4/2/
quelle
~~val
, Bruchteil abschneiden. Es ist etwas schneller, da eine bitweise Operation anstelle von zwei ausgeführt wird.(!isNaN(parseFloat(n)) && n % 1 === 0 && 0 <= ~~n)
true, false, 0xFF
und andere Werte schaffen es,isPositiveInteger
ohne erkannt zu werden.Es sieht so aus, als wäre ein regulärer Ausdruck der richtige Weg:
quelle
0
wo man normalerweise nicht erwartet, aber zum größten Teil scheint es in Ordnung zu sein.Die moderne Lösung, die im Knoten und in über 90% aller Browser (außer IE und Opera Mini) funktioniert, besteht darin, Number.isInteger zu verwenden, gefolgt von einer einfachen positiven Prüfung.
Dies wurde in ECMAScript 2015 abgeschlossen .
Das Polyfil ist:
Wenn Sie Eingaben unterstützen müssen, die möglicherweise in Zeichenfolgen- oder Zahlenform vorliegen, können Sie diese Funktion verwenden. Ich habe eine große Testsuite gegen geschrieben, nachdem alle vorhandenen Antworten (2/1/2018) bei einer Eingabe fehlgeschlagen sind.
quelle
Dies ist fast eine doppelte Frage für diese:
Überprüfen Sie Dezimalzahlen in JavaScript - IsNumeric ()
Die Antwort lautet:
Eine positive ganze Zahl wäre also:
quelle
funktioniert nicht, wenn Sie einen String wie '0001' angeben
quelle
Meine Funktion prüft, ob die Zahl + ve ist und auch einen Dezimalwert haben kann.
quelle
Um auf der obigen Antwort von VisioN aufzubauen, können Sie Folgendes verwenden, wenn Sie das jQuery-Validierungs-Plugin verwenden:
Dann können Sie in Ihrem normalen Regelsatz Folgendes verwenden oder dynamisch hinzufügen:
quelle
Einfach
Sie können Number auch erweitern und die Funktion über den Prototyp zuweisen.
quelle
Wenn Sie HTML5-Formulare verwenden, können Sie das Attribut
min="0"
für das Formularelement verwenden<input type="number" />
. Dies wird von allen gängigen Browsern unterstützt. Es beinhaltet kein Javascript für solch einfache Aufgaben, sondern ist in den neuen HTML-Standard integriert. Es ist unter https://www.w3schools.com/tags/att_input_min.asp dokumentiertquelle
(~~a == a)
Woa
ist die Zeichenfolge?quelle
~~"-1" == "-1"
wird zurückgegebentrue
. Und OP bat nur um positive ganze Zahlen.