Wie überprüfe ich, ob eine Variable in JavaScript eine Ganzzahl ist, und gebe eine Warnung aus, wenn dies nicht der Fall ist? Ich habe es versucht, aber es funktioniert nicht:
<html>
<head>
<script type="text/javascript">
var data = 22;
alert(NaN(data));
</script>
</head>
</html>
javascript
JBa
quelle
quelle
parseInt
.Number.isInteger
den am wenigsten hackigen Weg zu halten.Antworten:
Verwenden Sie den Operator === ( strikte Gleichheit ) wie folgt :
quelle
2.0 === 2
Da die unnötige Dezimalzahl nur eine andere Darstellung derselben ZahlparseInt(2.0) === 2.0
ist, entspricht diesparseInt(2) === 2
der WahrheitDas hängt davon ab, ob Sie auch Zeichenfolgen als potenzielle Ganzzahlen umwandeln möchten.
Das wird es tun:
Mit bitweisen Operationen
Einfach analysieren und überprüfen
Kurzschließen und Speichern einer Analyseoperation:
Oder vielleicht beides auf einmal:
Tests:
Hier ist die Geige: http://jsfiddle.net/opfyrqwp/28/
Performance
Tests haben ergeben, dass die Kurzschlusslösung die beste Leistung aufweist (ops / s).
Hier ist ein Benchmark: http://jsben.ch/#/htLVw
Wenn Sie sich für eine kürzere, stumpfe Form des Kurzschlusses interessieren:
Natürlich würde ich vorschlagen, dass der Minifier sich darum kümmert.
quelle
Angenommen, Sie wissen nichts über die betreffende Variable, sollten Sie diesen Ansatz wählen:
Einfach gesagt:
quelle
"1.0"
ist eine Zeichenfolge und daher keine Zahl. Andernfalls1
ist der Wert einer Variablen, wenn Sie ihn so einstellenvar my_var=1.0;
, was durch diese Funktion korrekt als Ganzzahl identifiziert wird.Number.isInteger()
wird es funktionieren ... bis dahin ist dies ein guter Weg, dies zu tunNumber.isInteger()
scheint der richtige Weg zu sein.MDN hat auch die folgende Polyfüllung für Browser bereitgestellt, die nicht
Number.isInteger()
alle IE-Versionen unterstützen.Link zur MDN-Seite
quelle
Sie können überprüfen, ob die Nummer einen Rest enthält:
Wohlgemerkt, wenn Ihre Eingabe auch Text sein könnte und Sie zuerst überprüfen möchten, ob dies nicht der Fall ist, können Sie zuerst den Typ überprüfen:
quelle
0 % 1 === 0
In der Konsole ausführen . Es wirdtrue
als0 % 1
Rückgabe zurückgegeben0
.0 % 1
kehrt0
im IE9-, IE8- und IE7-Kompatibilitätsmodus zurück.Sie können einen einfachen regulären Ausdruck verwenden:
quelle
Zunächst einmal ist NaN eine "Zahl" (ja, ich weiß, es ist komisch, rollen Sie einfach damit) und keine "Funktion".
Sie müssen sowohl prüfen, ob der Typ der Variablen eine Zahl ist, als auch auf Ganzzahlen prüfen, ob ich den Modul verwenden würde.
quelle
(0 == 0 || 0 % 1 == 0)
wird zu bewertentrue
.0 % 1 == 0
auch zu bewertentrue
!%
ist keine Teilung!Seien Sie vorsichtig bei der Verwendung
Eine leere Zeichenfolge ('') oder ein Boolescher Wert (true oder false) werden als Ganzzahl zurückgegeben. Vielleicht möchten Sie das nicht tun
Number.isInteger (Daten)
eingebaute Funktion im Browser. Unterstützt ältere Browser nicht
Alternativen:
Math.round () schlägt jedoch auch für leere Zeichenfolgen und Boolesche Werte fehl
quelle
So überprüfen Sie, ob eine Ganzzahl wie ein Poster gewünscht wird:
Beachten Sie + vor den Daten (konvertiert die Zeichenfolge in eine Zahl) und === für genau.
Hier einige Beispiele:
quelle
return (+data===parseInt(data))
?quelle
Die einfachste und sauberste Lösung vor ECMAScript-6 (die auch robust genug ist, um false zurückzugeben, selbst wenn ein nicht numerischer Wert wie eine Zeichenfolge oder null an die Funktion übergeben wird) lautet wie folgt:
Die folgende Lösung würde ebenfalls funktionieren, wenn auch nicht so elegant wie die oben genannte:
Beachten Sie, dass Math.ceil () oder Math.floor () in der obigen Implementierung gleich gut (anstelle von Math.round ()) verwendet werden können.
Oder alternativ:
Eine ziemlich häufige falsche Lösung ist die folgende:
Während dieser parseInt-basierte Ansatz für viele Werte von x gut funktioniert, funktioniert x nicht mehr richtig, sobald er ziemlich groß wird. Das Problem ist, dass parseInt () seinen ersten Parameter vor dem Parsen von Ziffern in einen String zwingt. Sobald die Zahl ausreichend groß wird, wird ihre Zeichenfolgendarstellung daher in Exponentialform dargestellt (z. B. 1e + 21). Dementsprechend versucht parseInt () dann, 1e + 21 zu analysieren, beendet jedoch die Analyse, wenn es das e-Zeichen erreicht, und gibt daher den Wert 1 zurück. Beachten Sie:
quelle
Warum hat niemand erwähnt
Number.isInteger()
?https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger
Funktioniert perfekt für mich und löst das Problem mit dem
NaN
Anfang einer Nummer.quelle
Number.isInteger()
3,5 Jahre vor Ihnen erwähnt: stackoverflow.com/a/27424770/5208540In ES6 2 werden neue Methoden für Number Object hinzugefügt.
Darin gibt die Number.isInteger () -Methode true zurück, wenn das Argument eine Ganzzahl ist.
Anwendungsbeispiel:
quelle
Der Standard ECMA-262 6.0 (ES6) enthält die Funktion Number.isInteger .
Um Unterstützung für alte Browser hinzuzufügen, empfehle ich dringend die Verwendung einer starken und von der Community unterstützten Lösung von:
https://github.com/paulmillr/es6-shim
Das ist reine ES6 JS Polyfills-Bibliothek .
Beachten Sie, dass für diese Bibliothek es5-shim erforderlich ist. Folgen Sie einfach README.md.
quelle
Sie könnten versuchen,
Number.isInteger(Number(value))
obvalue
es sich um eine Ganzzahl in Zeichenfolgenform handelt, z. B.var value = "23"
und Sie möchten, dass dies ausgewertet wirdtrue
. Vermeiden Sie es, es zu versuchen,Number.isInteger(parseInt(value))
da dies nicht immer den richtigen Wert zurückgibt. Wenn z. B.var value = "23abc"
und Sie dieparseInt
Implementierung verwenden, wird immer noch true zurückgegeben.Aber wenn Sie streng ganzzahlige Werte wollen,
Number.isInteger(value)
sollten Sie wahrscheinlich den Trick machen.quelle
quelle
Überprüfen Sie, ob die Variable der gleichen Variablen entspricht, die auf eine Ganzzahl gerundet ist, wie folgt:
quelle
true
für sehr einfach behebenNaN
, indem Sie einfach!=
zu!==
denif
Blöcken wechseln und diese invertieren . Dies funktioniert, weil diesNaN
der einzige Wert in JavaScript ist, der sich selbst nicht entspricht. Zum Beispiel sollte der neue Codeif (Math.round(x) === x) { /* x IS an integer! */ }
Außerdem
Number.isInteger()
. VielleichtNumber.isSafeInteger()
ist eine weitere Option hier durch die ES6-angegeben ist .So füllen Sie
Number.isSafeInteger(..)
Browser vor ES6 mehrfach aus:quelle
Number.isInteger()
ist der beste Weg, wenn Ihr Browser dies unterstützt. Wenn nicht, gibt es meiner Meinung nach so viele Möglichkeiten:oder:
oder:
oder:
Jetzt können wir die Ergebnisse testen:
Alle diese Methoden funktionieren also, aber wenn die Anzahl sehr groß ist, funktionieren parseInt und ^ operator nicht gut.
quelle
Versuchen Sie einfach Folgendes:
quelle
Sie können diese Funktion verwenden:
Es wird true zurückgegeben, auch wenn der Wert eine Zeichenfolge ist, die einen ganzzahligen Wert enthält.
Die Ergebnisse werden also sein:
quelle
Mein Ansatz:
a >= 1e+21
Test kann nur für einen Wert bestehen, der eine Zahl und sein muss eine sehr große sein muss. Dies wird sicher alle Fälle abdecken, im Gegensatz zu anderen Lösungen, die in dieser Diskussion bereitgestellt wurden.a === (a|0)
Wenn das Argument der angegebenen Funktion genau ist (===) mit dem bitweise transformierten Wert übereinstimmt, bedeutet dies, dass das Argument eine Ganzzahl ist.a|0
wird wieder0
für jeden Wert von ,a
dass keine Zahl ist , und wenna
ja eine Zahl ist, wird es etwas nach dem Komma abstreifen, so1.0001
wird sich1
quelle
Sie können Regexp dafür verwenden:
quelle
Von http://www.toptal.com/javascript/interview-questions :
Ich fand es der beste Weg, dies zu tun.
quelle
Verwenden Sie den
|
Operator:Eine Testfunktion könnte also folgendermaßen aussehen:
quelle
Dies löst ein weiteres Szenario ( 121. ), einen Punkt am Ende
quelle
Für positive ganzzahlige Werte ohne Trennzeichen:
Testet 1. wenn nicht leer und 2. wenn der Wert gleich dem Ergebnis eines Ersetzens eines nichtstelligen Zeichens in seinem Wert ist.
quelle
Ok wurde minus, weil mein Beispiel nicht beschrieben wurde, also mehr Beispiele :):
Ich benutze reguläre Ausdrücke und Testmethoden:
quelle
Sie können es auch so versuchen
oder
quelle
data=22.5;
. Auch beide Zweige habenconsole.log("not an integer")
:: SIch musste überprüfen, ob eine Variable (Zeichenfolge oder Zahl) eine Ganzzahl ist, und ich habe diese Bedingung verwendet:
http://jsfiddle.net/e267369d/1/
Einige der anderen Antworten haben eine ähnliche Lösung (verlassen Sie sich auf
parseFloat
kombiniert mitisNaN
), aber meine sollte direkter und selbsterklärender sein.Bearbeiten: Ich habe herausgefunden, dass meine Methode für Zeichenfolgen mit Komma (wie "1,2") fehlschlägt, und ich habe auch festgestellt, dass in meinem speziellen Fall die Funktion fehlschlagen soll, wenn eine Zeichenfolge keine gültige Ganzzahl ist (sollte bei einem Float fehlschlagen) sogar 1,0). Also hier ist meine Funktion Mk II:
http://jsfiddle.net/e267369d/3/
Natürlich können Sie die Punktbedingung jederzeit entfernen, falls Sie die Funktion tatsächlich benötigen, um Ganzzahl-Floats (1.0-Zeug) zu akzeptieren
a.indexOf('.') == -1
.quelle