Wie finde ich heraus, dass eine Nummer float
oder ist integer
?
1.25 --> float
1 --> integer
0 --> integer
0.25 --> float
javascript
types
numbers
coure2011
quelle
quelle
<nit-pick>
JavaScript hat keine unterschiedlichen numerischen Integer- und Float-Typen. Jede Zahl in JavaScript ist nur eineNumber
.</nit-pick>
Infinity
ein ganzzahliger oder ein nicht ganzzahliger Wert? Die Antworten hier sind in dieser Hinsicht ziemlich gleichmäßig verteilt.Infinity
kann sie nicht als ganze Zahl betrachtet werden.Antworten:
Überprüfen Sie auf einen Rest, wenn Sie durch 1 teilen:
Wenn Sie nicht wissen, dass das Argument eine Zahl ist, benötigen Sie zwei Tests:
Update 2019 5 Jahre nach dem Schreiben dieser Antwort wurde eine Lösung in ECMA Script 2015 standardisiert. Diese Lösung wird in dieser Antwort behandelt .
quelle
true
,false
,null
, ein leeres Array, ein Array mit einer einzigen integralen Nummer enthält, ein Array eine Zeichenfolge , die eine ganzzahlige Anzahl enthält, und vielleicht mehr.""
und1.0
isInt("");
&&isInt(1.0);
beide dazu führen,true
dass diese Demo angezeigt wird. Jsbin.com/elohuq/1/editfunction last (array) { return array[array.length - 1]; }
, ist dies "einfach falsch" oder "Schlechteste Antwort auf SO", weil nicht geprüft wird, ob das Argument zuerst ein Array ist? Ja, gute Praxis, um Argumente zu überprüfen, aber das liegt in der Verantwortung des Entwicklers. SO-Antworten sollten kurz sein und die Frage so klar wie möglich direkt beantworten.Probieren Sie diese Funktionen aus, um zu testen, ob ein Wert ein primitiver Zahlenwert ist, der keinen Bruchteil enthält und innerhalb der Größengrenzen dessen liegt, was als exakte Ganzzahl dargestellt werden kann.
quelle
n===+n
um nach Zahlenn|0
zu suchen, um zu runden), aber mit eingebauten Operatoren. funkyparseFloat()
zuerst auf.|
(OR) nur mit vorzeichenbehafteten 32-Bit-Ganzzahlen. OP gibt nicht an, ob das Ziel darin besteht, nach signierten int32-Werten zu suchen. Dies funktioniert also nicht mit Zahlen außerhalb des Bereichs.isInteger(5000000000)
wird zurückkehren,false
was falsch ist!Warum nicht so etwas:
quelle
n
in eine Zeichenfolge von konvertiert wirdparseInt
. Siehe MDN . Aber ich werde diese Lösung verwenden. :)Es gibt eine Methode namens,
Number.isInteger()
die derzeit in allem außer IE implementiert ist. MDN bietet auch eine Polyfüllung für andere Browser:In den meisten Anwendungsfällen ist es jedoch besser
Number.isSafeInteger
, wenn Sie auch prüfen, ob der Wert so hoch / niedrig ist, dass Dezimalstellen ohnehin verloren gegangen wären. MDN hat auch dafür ein Polyfil. (Sie benötigen auch dieisInteger
Pollyfill oben.)quelle
12.0 ∈ ℤ
.Number.isInteger
. Es ist jedoch eine korrekte Polyfüllung fürNumber.isSafeInteger
.Number.isInteger
sollte nicht prüfen, ob die Zahl eine "sichere Ganzzahl" ist. Siehe zu MDN: isInteger und isSafeInteger .Sie können einen einfachen regulären Ausdruck verwenden:
Oder Sie können die folgenden Funktionen entsprechend Ihren Anforderungen verwenden. Sie werden vom PHPJS-Projekt entwickelt .
is_int()
=> Überprüfen Sie, ob der Variablentyp eine Ganzzahl ist und ob sein Inhalt eine Ganzzahl istis_float()
=> Überprüfen Sie, ob der Variablentyp float ist und ob sein Inhalt float istctype_digit()
=> Überprüfen Sie, ob der Variablentyp ein String ist und ob sein Inhalt nur Dezimalstellen enthältUpdate 1
Jetzt werden auch negative Zahlen überprüft, danke für den Kommentar von @ChrisBartley !
quelle
/^[0-9]+$/.test(String(value))
/^[0-9]+$/.test(''+value)
return /^-?\d+$/.test(String(value));
Hier sind effiziente Funktionen, die prüfen, ob der Wert eine Zahl ist oder sicher in eine Zahl umgewandelt werden kann :
Und für ganze Zahlen (würde false zurückgeben, wenn der Wert ein Float ist):
Die Effizienz hierbei ist, dass parseInt (oder parseNumber) vermieden werden, wenn der Wert bereits eine Zahl ist. Beide Parsing-Funktionen immer konvertieren in eine Zeichenfolge und versuchen dann, diese Zeichenfolge zu analysieren. Dies wäre eine Verschwendung, wenn der Wert bereits eine Zahl ist.
Vielen Dank an die anderen Beiträge hier für weitere Ideen zur Optimierung!
quelle
quelle
1.2
. Testen Sie numerische Funktionen immer mit 0,1 0,2 0,3funktioniert für alle Fälle.
quelle
isInt('1')
kehrttrue
wie erwartet zurück (zumindest für mich). Seltsam genug, aber diese Rückkehrtrue
zuisInt([5])
auch. War für mich nicht wichtig, aber vielleicht für dich, also pass auf dich auf.Wie andere bereits erwähnt haben, haben Sie in JS nur Doppel. Wie definieren Sie eine Zahl als Ganzzahl? Überprüfen Sie einfach, ob die gerundete Zahl gleich ist:
quelle
isFloat('abc')
zurücktrue
isFloat(NaN) // true
Wie wäre es mit diesem?
quelle
console.log(isFloat(1.0));
Ergebnisse falsch.Folgendes verwende ich für ganze Zahlen:
Kurz, schön :) Funktioniert die ganze Zeit. Dies ist, was David Flanagan vorschlägt, wenn ich mich nicht irre.
quelle
parseFloat
?Es kommt wirklich darauf an, was Sie erreichen wollen. Wenn Sie stark typisierte Sprachen "emulieren" möchten, empfehle ich Ihnen, es nicht zu versuchen. Wie bereits erwähnt, haben alle Zahlen dieselbe Darstellung (denselben Typ).
Mit etwas wie Claudiu zur Verfügung gestellt:
isInteger( 1.0 )
-> wahrDas sieht gut aus für den gesunden Menschenverstand, aber in so etwas wie C würde man bekommen
false
quelle
Alle Float-Zahlen mit einem Dezimalteil von Null (z. B. 1.0, 12.00, 0.0) werden implizit in Integer umgewandelt, sodass nicht überprüft werden kann, ob sie Float sind oder nicht.
quelle
quelle
!!(24.0%1)
ist falschEs muss wirklich nicht so kompliziert sein. Der numerische Wert der Entsprechungen parseFloat () und parseInt () einer Ganzzahl ist identisch. So können Sie Folgendes tun:
Dann
Dies ermöglicht auch Zeichenfolgenprüfungen und ist daher nicht streng. Wenn Sie eine starke Lösung wünschen (auch bekannt als, funktioniert nicht mit Zeichenfolgen):
quelle
Ich hatte noch keinen Fall, in dem dies nicht funktioniert hat.
quelle
2
es sich um eine Ganzzahl handelt und23
als zweites Argument für die Funktion betrachtet wird. In Javascript werden Dezimalstellen mit Punkt als Trennzeichen geschrieben - so sollte es sein2.23
.Dies ist der endgültige Code für die Überprüfung von INT und FLOAT
ODER
quelle
quelle
Es ist so einfach wie:
Versuchen Sie dies in der Konsole:
Das verwirrt viele Leute. Immer wenn etwas .0 ist, ist es kein Float mehr. Es ist eine ganze Zahl. Oder man kann es einfach "eine numerische Sache" nennen, denn es gibt keine strenge Unterscheidung wie damals in C. Gute alte Zeiten.
Alles, was Sie tun können, ist, nach einer Ganzzahl zu suchen und die Tatsache zu akzeptieren, dass 1.000 eine Ganzzahl ist.
Interessante Randnotiz
Es gab einen Kommentar über große Zahlen. Riesige Zahlen bedeuten für diesen Ansatz KEIN Problem. Wenn parseInt die Zahl nicht verarbeiten kann (weil sie zu groß ist), wird etwas anderes als der tatsächliche Wert zurückgegeben, sodass der Test FALSE zurückgibt. Dies ist eine gute Sache, denn wenn Sie etwas als "Zahl" betrachten, erwarten Sie normalerweise, dass JS damit rechnen kann - also ja, die Zahlen sind begrenzt und parseInt wird dies berücksichtigen , um es so auszudrücken .
Versuche dies:
In meinem Browser (IE8) gibt dies "a ist in Ordnung; b schlägt fehl" zurück, was genau auf die große Zahl in b zurückzuführen ist. Das Limit kann variieren, aber ich denke, 20 Ziffern "sollten für jeden reichen", um einen Klassiker zu zitieren :)
quelle
Number.isInteger
.Number.isInteger
. Ein Einzeilentest istn === (n | 0)
wie in einer anderen Antwort gezeigt.Diese Lösung hat bei mir funktioniert.
quelle
Für ganze Zahlen verwende ich dies
quelle
In Java-Skripten sind alle Zahlen
internally 64 bit floating point
identisch mit Double in Java. Es gibt keine unterschiedlichen Typen in Javascript, alle werden nach Typ dargestelltnumber
. Daher können Sie keineninstanceof
Scheck machen. Sie können jedoch die oben angegebenen Lösungen verwenden, um herauszufinden, ob es sich um eine Bruchzahl handelt. Designer von Java-Skripten, die mit einem einzigen Typ gefühlt haben, können zahlreiche Typumwandlungsfehler vermeiden.quelle
Manchmal können Sie mit Number-Objekten den Mod-Operator (%) nicht direkt verwenden. Wenn Sie mit diesem Fall konfrontiert sind, können Sie diese Lösung verwenden.
quelle
Als ich einige der Antworten hier versuchte, schrieb ich diese Lösung. Dies funktioniert auch mit Zahlen innerhalb einer Zeichenfolge.
quelle
Dies ist möglicherweise nicht so performant wie die% -Antwort, wodurch verhindert wird, dass Sie zuerst in einen String konvertieren müssen, aber ich habe noch niemanden gesehen, der ihn veröffentlicht hat. Hier ist eine weitere Option, die gut funktionieren sollte:
quelle
Für diejenigen, die neugierig sind und Benchmark.js verwenden, habe ich die am besten bewerteten Antworten (und die heute veröffentlichten) auf diesen Beitrag getestet. Hier sind meine Ergebnisse:
quelle
Hier ist mein Code. Es wird überprüft, ob es sich um eine leere Zeichenfolge handelt (die sonst übergeben wird), und anschließend in ein numerisches Format konvertiert. Abhängig davon, ob '1.1' gleich 1.1 sein soll, ist dies möglicherweise das, wonach Sie suchen, oder auch nicht.
quelle
Ich mag diese kleine Funktion, die sowohl für positive als auch für negative ganze Zahlen wahr ist:
Dies funktioniert, weil 1 oder "1" zu "1.0" wird, was ist, dass NaN () false zurückgibt (was wir dann negieren und zurückgeben), aber 1.0 oder "1.0" zu "1.0.0" wird, während "string" zu "string" wird. 0 ", von denen keine Zahlen sind, daher gibt isNaN () false zurück (und wird erneut negiert).
Wenn Sie nur positive ganze Zahlen möchten, gibt es diese Variante:
oder für negative ganze Zahlen:
isPositiveInt () verschiebt die verkettete numerische Zeichenfolge vor den zu testenden Wert. Zum Beispiel führt isPositiveInt (1) dazu, dass isNaN () "01" auswertet, was false auswertet. Währenddessen führt isPositiveInt (-1) dazu, dass isNaN () "0-1" auswertet, was true ergibt. Wir negieren den Rückgabewert und das gibt uns, was wir wollen. isNegativeInt () funktioniert ähnlich, ohne jedoch den Rückgabewert von isNaN () zu negieren.
Bearbeiten:
Meine ursprüngliche Implementierung würde auch für Arrays und leere Zeichenfolgen true zurückgeben. Diese Implementierung hat diesen Fehler nicht. Es hat auch den Vorteil, dass es frühzeitig zurückgegeben wird, wenn val keine Zeichenfolge oder Zahl ist oder wenn es eine leere Zeichenfolge ist, was es in diesen Fällen schneller macht. Sie können es weiter ändern, indem Sie die ersten beiden Klauseln durch ersetzen
wenn Sie nur Literalzahlen (und keine Zeichenfolgen) abgleichen möchten)
Bearbeiten:
Ich kann noch keine Kommentare posten, daher füge ich dies meiner Antwort hinzu. Der von @Asok veröffentlichte Benchmark ist sehr informativ. Die schnellste Funktion entspricht jedoch nicht den Anforderungen, da sie auch TRUE für Floats, Arrays, Boolesche Werte und leere Zeichenfolgen zurückgibt.
Ich habe die folgende Testsuite erstellt, um jede der Funktionen zu testen, und meine Antwort ebenfalls zur Liste hinzugefügt (Funktion 8, die Zeichenfolgen analysiert, und Funktion 9, die dies nicht tut):
Ich habe auch den Benchmark mit der Funktion # 8 wiederholt, die der Liste hinzugefügt wurde. Ich werde das Ergebnis nicht veröffentlichen, da sie etwas peinlich sind (z. B. ist diese Funktion NICHT schnell) ...
Die (gekürzt - ich habe erfolgreiche Tests entfernt, da die Ausgabe ziemlich lang ist) Ergebnisse sind wie folgt:
Ich habe Fehler hinterlassen, damit Sie sehen können, wo jede Funktion ausfällt, und die (Zeichenfolge) '#' testet, damit Sie sehen können, wie jede Funktion Ganzzahl- und Gleitkommawerte in Zeichenfolgen behandelt, da einige diese möglicherweise als Zahlen und andere analysieren möchten nicht dürfen.
Von den 10 getesteten Funktionen sind diejenigen, die tatsächlich den Anforderungen von OP entsprechen, [1,3,5,6,8,9]
quelle
Bedingung für die Floating-Validierung:
Bedingung für die Ganzzahlvalidierung:
Hoffe das könnte hilfreich sein.
quelle
Sie können hinzufügen,
typeof a === 'number'
wenn Sie Zeichenfolgen ausschließen möchten.quelle