Ich hoffe, dass es etwas gibt, das sich im gleichen konzeptionellen Rahmen bewegt wie das alte VB6 IsNumeric()
Funktion?
Antworten
Zu viele Anzeigen?2. Oktober 2020: Beachten Sie, dass viele Bare-Bones-Ansätze mit subtilen Fehlern behaftet sind (z. B. Leerzeichen, implizites partielles Parsing, Radix, Zwangsumwandlung von Arrays usw.), die in vielen der Antworten hier nicht berücksichtigt werden. Die folgende Implementierung könnte für Sie funktionieren, aber beachten Sie, dass sie keine anderen Zahlentrennzeichen als das Dezimalkomma berücksichtigt " .
":
function isNumeric(str) {
if (typeof str != "string") return false // we only process strings!
return !isNaN(str) && // use type coercion to parse the _entirety_ of the string (`parseFloat` alone does not do this)...
!isNaN(parseFloat(str)) // ...and ensure strings of whitespace fail
}
Um zu prüfen, ob eine Variable (einschließlich einer Zeichenkette) eine Zahl ist, prüfen Sie, ob sie nicht eine Zahl ist:
Dies funktioniert unabhängig davon, ob der Inhalt der Variablen eine Zeichenkette oder eine Zahl ist.
isNaN(num) // returns true if the variable does NOT contain a valid number
Beispiele
isNaN(123) // false
isNaN('123') // false
isNaN('1e10000') // false (This translates to Infinity, which is a number)
isNaN('foo') // true
isNaN('10px') // true
isNaN('') // false
isNaN(' ') // false
isNaN(false) // false
Natürlich können Sie dies bei Bedarf verneinen. Zum Beispiel, um die IsNumeric
Beispiel, das Sie genannt haben:
function isNumeric(num){
return !isNaN(num)
}
Um eine Zeichenkette, die eine Zahl enthält, in eine Zahl umzuwandeln:
Funktioniert nur, wenn die Zeichenkette nur numerische Zeichen enthält, sonst gibt es NaN
.
+num // returns the numeric value of the string, or NaN
// if the string isn't purely numeric characters
Beispiele
+'12' // 12
+'12.' // 12
+'12..' // NaN
+'.12' // 0.12
+'..12' // NaN
+'foo' // NaN
+'12px' // NaN
So wandeln Sie eine Zeichenkette in eine Zahl um
Nützlich für die Konvertierung von "12px" in 12, zum Beispiel:
parseInt(num) // extracts a numeric value from the
// start of the string, or NaN.
Beispiele
parseInt('12') // 12
parseInt('aaa') // NaN
parseInt('12px') // 12
parseInt('foo2') // NaN These last three may
parseInt('12a5') // 12 be different from what
parseInt('0x10') // 16 you expected to see.
Schwimmer
Beachten Sie, dass im Gegensatz zu +num
, parseInt
(wie der Name schon sagt) konvertiert eine Fließkommazahl in eine ganze Zahl, indem es alles nach dem Dezimalpunkt abschneidet (wenn Sie die parseInt()
wegen dieses Verhalten, Sie sind wahrscheinlich besser dran, wenn Sie stattdessen eine andere Methode anwenden ):
+'12.345' // 12.345
parseInt(12.345) // 12
parseInt('12.345') // 12
Leere Zeichenfolgen
Leere Zeichenketten sind vielleicht ein wenig kontraintuitiv. +num
konvertiert leere Zeichenketten oder Zeichenketten mit Leerzeichen zu Null, und isNaN()
setzt dasselbe voraus:
+'' // 0
+' ' // 0
isNaN('') // false
isNaN(' ') // false
Aber parseInt()
ist nicht einverstanden:
parseInt('') // NaN
parseInt(' ') // NaN
Wenn Sie nur prüfen wollen, ob eine Zeichenkette eine ganze Zahl ist (keine Nachkommastellen), ist Regex eine gute Lösung. Andere Methoden wie isNaN
sind zu kompliziert für etwas so Einfaches.
function isNumeric(value) {
return /^-?\d+$/.test(value);
}
console.log(isNumeric('abcd')); // false
console.log(isNumeric('123a')); // false
console.log(isNumeric('1')); // true
console.log(isNumeric('1234567890')); // true
console.log(isNumeric('-23')); // true
console.log(isNumeric(1234)); // true
console.log(isNumeric(1234n)); // true
console.log(isNumeric('123.4')); // false
console.log(isNumeric('')); // false
console.log(isNumeric(undefined)); // false
console.log(isNumeric(null)); // false
Um nur zuzulassen positiv ganze Zahlen verwenden:
function isNumeric(value) {
return /^\d+$/.test(value);
}
console.log(isNumeric('123')); // true
console.log(isNumeric('-23')); // false
Die akzeptierte Antwort auf diese Frage hat einige Schwachstellen (wie von einigen anderen Benutzern hervorgehoben). Dies ist eine der einfachsten und bewährten Weg, um es in Javascript zu nähern:
function isNumeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
Im Folgenden finden Sie einige gute Testfälle:
console.log(isNumeric(12345678912345678912)); // true
console.log(isNumeric('2 ')); // true
console.log(isNumeric('-32.2 ')); // true
console.log(isNumeric(-32.2)); // true
console.log(isNumeric(undefined)); // false
// the accepted answer fails at these tests:
console.log(isNumeric('')); // false
console.log(isNumeric(null)); // false
console.log(isNumeric([])); // false
Wenn Sie wirklich sicherstellen wollen, dass eine Zeichenkette nur eine Zahl, eine beliebige Zahl (Ganzzahl oder Fließkomma) und genau eine Zahl enthält, können Sie kann nicht verwenden. parseInt()
/ parseFloat()
, Number()
, oder !isNaN()
von selbst. Beachten Sie, dass !isNaN()
kehrt tatsächlich zurück true
wenn Number()
würde eine Zahl zurückgeben, und false
wenn sie zurückkehren würde NaN
Daher werde ich sie aus der weiteren Diskussion ausschließen.
Das Problem mit parseFloat()
ist, dass es eine Zahl zurückgibt, wenn die Zeichenkette eine beliebige Zahl enthält, auch wenn die Zeichenkette keine Zahl enthält nur y genau eine Nummer:
parseFloat("2016-12-31") // returns 2016
parseFloat("1-1") // return 1
parseFloat("1.2.3") // returns 1.2
Das Problem mit Number()
ist, dass es auch dann eine Zahl zurückgibt, wenn der übergebene Wert gar keine Zahl ist!
Number("") // returns 0
Number(" ") // returns 0
Number(" \u00A0 \t\n\r") // returns 0
Das Problem mit Rolling Your Own Regex ist, dass, wenn Sie die genaue Regex für den Abgleich einer Gleitkommazahl, wie Javascript erkennt es Sie gehen, um Fälle zu verpassen oder zu erkennen, wo Sie nicht sollten. Und selbst wenn Sie Ihre eigene Regex erstellen können, warum? Es gibt einfachere eingebaute Möglichkeiten, dies zu tun.
Es stellt sich jedoch heraus, dass Number()
(und isNaN()
) das Richtige für jeden Fall, in dem parseFloat()
gibt eine Zahl zurück, wenn sie es nicht sollte, und umgekehrt. Um also herauszufinden, ob eine Zeichenkette wirklich genau und nur eine Zahl ist, rufen Sie beide Funktionen auf und sehen Sie, ob sie ambos true zurückgeben:
function isNumber(str) {
if (typeof str != "string") return false // we only process strings!
// could also coerce to string: str = ""+str
return !isNaN(str) && !isNaN(parseFloat(str))
}
- See previous answers
- Weitere Antworten anzeigen