Ich hoffe, es gibt etwas im selben konzeptionellen Raum wie die alte VB6- IsNumeric()
Funktion?
javascript
validation
numeric
Electrons_Ahoy
quelle
quelle
isNaN("")
,isNaN(" ")
,isNaN(false)
, etc. Es kehrtfalse
für diese, was bedeutet , dass sie Zahlen sind.Antworten:
Um zu überprüfen, ob eine Variable (einschließlich einer Zeichenfolge) eine Zahl ist, überprüfen Sie, ob es sich nicht um eine Zahl handelt:
Dies funktioniert unabhängig davon, ob der variable Inhalt eine Zeichenfolge oder eine Zahl ist.
Beispiele
Natürlich können Sie dies bei Bedarf negieren. Um beispielsweise das von
IsNumeric
Ihnen angegebene Beispiel zu implementieren :So konvertieren Sie eine Zeichenfolge mit einer Zahl in eine Zahl:
Funktioniert nur, wenn die Zeichenfolge nur numerische Zeichen enthält, andernfalls wird sie zurückgegeben
NaN
.Beispiele
So konvertieren Sie eine Zeichenfolge lose in eine Zahl
Nützlich für die Konvertierung von '12px' in 12, zum Beispiel:
Beispiele
Schwimmt
Beachten Sie, dass, im Gegensatz zu
+num
,parseInt
(wie der Name schon sagt) ein Schwimmer in eine ganze Zahl konvertieren , indem off alles Zerhacken des ersten Dezimalstelle (wenn Sie verwenden möchten ,parseInt()
weil dieses Verhalten, sind Sie wahrscheinlich besser dran , eine andere Methode stattdessen verwenden ) ::Leere Saiten
Leere Zeichenfolgen können etwas kontraintuitiv sein.
+num
konvertiert leere Zeichenfolgen oder Zeichenfolgen mit Leerzeichen in Null undisNaN()
setzt dasselbe voraus:Aber
parseInt()
stimmt nicht zu:quelle
isNaN
"Überprüfen, ob eine Variable keine Zahl ist" verwenden. "keine Zahl" ist nicht dasselbe wie "IEEE-794 NaN", woraufisNaN
getestet wird. Insbesondere schlägt diese Verwendung fehl, wenn zumindest Boolesche Werte und leere Zeichenfolgen getestet werden. Siehe developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… .var n = 'a'; if (+n === +n) { // is number }
Sie ist ~ 3994% schneller als isNaN in der neuesten Version von Chrome. Sehen Sie den Leistungstest hier: jsperf.com/isnan-vs-typeof/5isNaN(1 + false + parseInt("1.do you trust your users?"))
Und Sie könnten den RegExp-Weg gehen:
quelle
Wenn Sie nur versuchen zu überprüfen, ob eine Zeichenfolge eine ganze Zahl ist (keine Dezimalstellen), ist Regex ein guter Weg. Andere Methoden wie
isNaN
sind für etwas so Einfaches zu kompliziert.Um nur positive ganze Zahlen zuzulassen , verwenden Sie Folgendes:
quelle
/^-?\d+$/
Recht?Wenn Sie wirklich sicherstellen möchten , dass ein String nur eine Zahl enthält, eine beliebige Anzahl (ganze oder Gleitkomma-) und genau eine Nummer, Sie können nicht verwenden
parseInt()
/parseFloat()
,Number()
oder für!isNaN()
sich. Beachten Sie, dass!isNaN()
tatsächlich zurückgegeben wird,true
wannNumber()
eine Zahl zurückgegeben wird undfalse
wann sie zurückgegebenNaN
wird. Daher werde ich sie vom Rest der Diskussion ausschließen.Das Problem dabei
parseFloat()
ist, dass eine Zahl zurückgegeben wird, wenn die Zeichenfolge eine beliebige Zahl enthält, auch wenn die Zeichenfolge nicht nur und genau eine Zahl enthält:Das Problem dabei
Number()
ist, dass eine Zahl zurückgegeben wird, wenn der übergebene Wert überhaupt keine Zahl ist!Das Problem beim Rollen Ihres eigenen regulären Ausdrucks besteht darin, dass Sie Fälle verpassen oder Fälle erkennen, in denen Sie dies nicht tun sollten, es sei denn, Sie erstellen den genauen regulären Ausdruck für die Übereinstimmung mit einer Gleitkommazahl, wie sie von Javascript erkannt wird. Und selbst wenn Sie Ihren eigenen regulären Ausdruck rollen können, warum? Es gibt einfachere integrierte Möglichkeiten, dies zu tun.
Es stellt sich jedoch heraus, dass
Number()
(undisNaN()
) das Richtige für jeden Fall tun, in demparseFloat()
eine Zahl zurückgegeben wird, wenn dies nicht der Fall sein sollte, und umgekehrt. Um herauszufinden, ob eine Zeichenfolge wirklich genau und nur eine Zahl ist, rufen Sie beide Funktionen auf und prüfen Sie, ob beide true zurückgeben:quelle
' 1'
,'2 '
Und' 3 '
alle return true.isNumber
Funktion benötigen , sich nicht mit Benutzeroberflächen befassen. Außerdem lässt eine gute Zahleneingabe zunächst keine Leerzeichen zu.Die akzeptierte Antwort auf diese Frage weist einige Mängel auf (wie von einigen anderen Benutzern hervorgehoben). Dies ist eine der einfachsten und bewährten Methoden, um in Javascript darauf zuzugreifen:
Nachfolgend einige gute Testfälle:
quelle
Probieren Sie die isNan-Funktion aus :
quelle
isNaN()
Gibtfalse
für JEDE Zeichenfolge zurück, die nur Leerzeichen enthält, einschließlich '\ u00A0'.Alte Frage, aber in den gegebenen Antworten fehlen einige Punkte.
Wissenschaftliche Schreibweise.
!isNaN('1e+30')
isttrue
jedoch in den meisten Fällen, wenn Menschen nach Zahlen fragen, wollen sie nicht Dinge wie übereinstimmen1e+30
.Große schwebende Zahlen können sich seltsam verhalten
Beobachten Sie (mit Node.js):
Auf der anderen Seite:
Wenn Sie also damit rechnen
String(Number(s)) === s
, sollten Sie Ihre Zeichenfolgen besser auf höchstens 15 Stellen beschränken (nachdem Sie führende Nullen weggelassen haben).Unendlichkeit
Überprüfen Sie vor diesem Hintergrund, ob die angegebene Zeichenfolge eine Zahl ist, die alle folgenden Anforderungen erfüllt:
Number
und zurück zuString
ist keine so einfache Aufgabe. Hier ist eine einfache Version:
Allerdings ist auch dieser alles andere als vollständig. Führende Nullen werden hier nicht behandelt, aber sie schrauben den Längen-Test.
quelle
Ich habe getestet und Michaels Lösung ist am besten. Stimmen Sie oben für seine Antwort ab (suchen Sie auf dieser Seite nach "Wenn Sie wirklich sicherstellen möchten, dass eine Zeichenfolge vorhanden ist", um sie zu finden). Im Wesentlichen lautet seine Antwort:
Es funktioniert für jeden Testfall, den ich hier dokumentiert habe: https://jsfiddle.net/wggehvp9/5/
Viele der anderen Lösungen schlagen für diese Randfälle fehl: '', null, "", true und []. Theoretisch könnten Sie sie mit der richtigen Fehlerbehandlung verwenden, zum Beispiel:
oder
mit spezieller Behandlung für / \ s /, null, "", true, false, [] (und andere?)
quelle
Sie können das Ergebnis von Number verwenden, wenn Sie ein Argument an seinen Konstruktor übergeben.
Wenn das Argument (eine Zeichenfolge) nicht in eine Zahl konvertiert werden kann, gibt es NaN zurück, sodass Sie feststellen können, ob die angegebene Zeichenfolge eine gültige Zahl war oder nicht.
Hinweise: Hinweis beim Übergeben einer leeren Zeichenfolge oder
'\t\t'
und'\n\t'
als Zahl wird 0 zurückgegeben; Wenn Sie true übergeben, wird 1 und false 0 zurückgegeben.quelle
Number
Konstruktor ist genau der gleiche wie+x
.Number()
Float-Nummern verarbeitet, wieNumber.parseFloat()
nichtNumber.parseInt()
Vielleicht stoßen ein oder zwei Personen auf diese Frage, die eine viel strengere Prüfung als gewöhnlich benötigen (wie ich). In diesem Fall kann dies nützlich sein:
In acht nehmen! Dies wird ablehnen Strings wie
.1
,40.000
,080
,00.1
. Es ist sehr wählerisch - die Saite muss mit der " minimalsten perfekten Form " übereinstimmen " der Zahl damit dieser Test bestanden wird.Es verwendet den Konstruktor
String
undNumber
, um die Zeichenfolge in eine Zahl und wieder zurück umzuwandeln, und prüft somit, ob die "perfekte Minimalform" der JavaScript-Engine (diejenige, in die sie mit dem ursprünglichenNumber
Konstruktor konvertiert wurde ) mit der ursprünglichen Zeichenfolge übereinstimmt.quelle
(str === String(Math.round(Number(str))))
."Infinity"
,"-Infinity"
und"NaN"
diesen Test bestehen. Dies kann jedoch durch einen zusätzlichenNumber.isFinite
Test behoben werden .str === ("" + +str)
. Grundsätzlich wird geprüft, ob die Zeichenfolge das Ergebnis der Zeichenfolge einer JS-Nummer ist. Wenn wir dies wissen, können wir auch ein Problem erkennen: Der Test besteht für0.000001
, schlägt jedoch fehl0.0000001
, wenn er1e-7
stattdessen bestanden wird. Das gleiche gilt für sehr große Zahlen.parseInt (), aber beachten Sie, dass diese Funktion etwas anders ist, da sie beispielsweise 100 für parseInt ("100px") zurückgibt.
quelle
parseInt(09)
.paraseInt(09, 10)
, 10
Argument nicht mehr.parseInt('09')
jetzt gleich 9.Zitat:
Dies ist nicht ganz richtig, wenn Sie nach führenden / nachfolgenden Leerzeichen suchen müssen - beispielsweise wenn eine bestimmte Anzahl von Ziffern erforderlich ist und Sie beispielsweise '1111' und nicht '111' oder '111' für möglicherweise eine PIN erhalten müssen Eingang.
Besser zu verwenden:
quelle
'-1'
,'0.1'
und'1e10'
alle return false. Darüber hinaus geben Werte größer als positive Unendlichkeit oder kleiner als negative Unendlichkeit true zurück, während sie wahrscheinlich false zurückgeben sollten.Warum ist die Implementierung von jQuery nicht gut genug?
Michael schlug so etwas vor (obwohl ich hier die geänderte Version von "user1691651 - John" gestohlen habe):
Das Folgende ist eine Lösung mit höchstwahrscheinlich schlechter Leistung, aber soliden Ergebnissen. Es handelt sich um eine Erfindung aus der Implementierung von jQuery 1.12.4 und Michaels Antwort mit einer zusätzlichen Überprüfung für führende / nachfolgende Leerzeichen (da Michaels Version für Zahlen mit führenden / nachfolgenden Leerzeichen true zurückgibt):
Die letztere Version hat jedoch zwei neue Variablen. Man könnte eines davon umgehen, indem man:
Ich habe keines dieser Verfahren sehr oft getestet, außer durch manuelles Testen der wenigen Anwendungsfälle, die ich mit meiner aktuellen Situation treffen werde, was alles sehr Standard ist. Dies ist eine Situation, in der Riesen auf den Schultern stehen.
quelle
Es ist nicht gültig für TypeScript als:
declare function isNaN(number: number): boolean;
Für TypeScript können Sie Folgendes verwenden:
/^\d+$/.test(key)
quelle
Nun, ich benutze dieses, das ich gemacht habe ...
Es hat bisher funktioniert:
Wenn Sie ein Problem damit feststellen, sagen Sie es mir bitte.
quelle
return !isNaN(parseInt(value, 10));
Wenn jemand jemals so weit unten kommt, habe ich einige Zeit damit verbracht, mich mit dem Versuch zu beschäftigen, moment.js ( https://github.com/moment/moment ) zu patchen . Hier ist etwas, das ich weggenommen habe:
Behandelt die folgenden Fälle:
Wahr! ::
Falsch! ::
Ironischerweise derjenige, mit dem ich am meisten zu kämpfen habe:
Anregungen sind willkommen. :]
quelle
isNumeric(' ')
undisNumeric('')
?&& (val.replace(/\s/g,'') !== '') //Empty && (val.slice(-1) !== '.') //Decimal without Number
um das oben erwähnte Problem und eines, das ich selbst hatte, anzusprechen.Verwenden von einfachem JavaScript:
Verwenden von Lodash:
quelle
quelle
2019: Einschließlich ES3-, ES6- und TypeScript-Beispiele
Vielleicht wurde dies zu oft wiederholt, aber ich habe heute auch mit dieser gekämpft und wollte meine Antwort posten, da ich keine andere Antwort gesehen habe, die es so einfach oder gründlich macht:
ES3
ES6
Typoskript
Dies scheint recht einfach zu sein und deckt alle Grundlagen ab, die ich auf den vielen anderen Posts gesehen und mir selbst ausgedacht habe:
Sie können auch Ihre eigene
isNumeric
Funktion ausprobieren und in diesen Anwendungsfällen einfach vorbei gehen und für alle nach "true" suchen .Oder um die Werte anzuzeigen, die jeweils zurückgegeben werden:
quelle
2019: Praktische und strenge numerische Gültigkeitsprüfung
Oft bedeutet eine "gültige Zahl" eine Javascript-Zahl ohne NaN und Infinity, dh eine "endliche Zahl".
Um die numerische Gültigkeit eines Werts zu überprüfen (z. B. von einer externen Quelle), können Sie Folgendes im ESlint Airbnb-Stil definieren:
und benutze es so:
quelle
PFB die Arbeitslösung:
quelle
Sparen Sie sich die Kopfschmerzen beim Versuch, eine "integrierte" Lösung zu finden.
Es gibt keine gute Antwort und die äußerst positive Antwort in diesem Thread ist falsch.
npm install is-number
quelle
Ich habe kürzlich einen Artikel über Möglichkeiten geschrieben, um sicherzustellen, dass eine Variable eine gültige Zahl ist: https://github.com/jehugaleahsa/artifacts/blob/master/2018/typescript_num_hack.md In diesem Artikel wird erläutert, wie Sie Gleitkomma oder Ganzzahl sicherstellen können, wenn dies der Fall ist wichtig (
+x
vs.~~x
).Der Artikel geht davon aus, dass die Variable zunächst a
string
oder a istnumber
undtrim
verfügbar / polygefüllt ist. Es wäre nicht schwer, es auch auf andere Typen auszudehnen. Hier ist das Fleisch davon:quelle
Mein Versuch einer etwas verwirrenden, vielleicht nicht die beste Lösung
quelle
042
) und hexadezimal (0x45f
)In meiner Anwendung erlauben wir nur az AZ und 0-9 Zeichen. Ich fand die Antwort oben mit " string % 1 === 0" funktioniert, es sei denn, der String begann mit 0xnn (wie 0x10) und gab ihn dann als numerisch zurück, wenn wir es nicht wollten. Die folgende einfache Falle in meiner numerischen Prüfung scheint in unseren speziellen Fällen den Trick zu tun.
Warnung : Dies könnte einen langjährigen Fehler in Javascript und Actionscript [Number ("1" + the_string)% 1 === 0)] ausnutzen. Ich kann nicht dafür sprechen, aber es ist genau das, was wir brauchten.
quelle
% 1
Operation aufrufen ), und dies interpretiert die Zeichenfolge als Hex- oder Float-Literal.Meine Lösung:
Sie können zusätzliche Bedingungen innerhalb der Schleife hinzufügen, um Ihren speziellen Anforderungen gerecht zu werden.
quelle
Sie können Typen wie die Flussbibliothek verwenden , um eine statische Überprüfung der Kompilierungszeit zu erhalten. Natürlich nicht besonders nützlich für Benutzereingaben.
quelle
Hier ist ein Einzeiler, um zu überprüfen, ob
sNum
es sich um einen gültigen numerischen Wert handelt. Es wurde für eine Vielzahl von Eingaben getestet:quelle
Verwenden Sie einfach
isNaN()
, dies konvertiert die Zeichenfolge in eine Zahl und wenn Sie eine gültige Zahl erhalten , wird zurückgegebenfalse
...quelle
Ich benutze folgendes:
quelle
1..1
,1,1
,-32.1.12
, und was noch wichtiger ausfälltundefined
undNaN
. Wenn Sie bestanden habenundefined
oder ein,NaN
dass es Ihnen ein falsch positives Sprichwort zurückgeben würde, war es eine Zahl.