Ich hoffe, dass es etwas gibt, das sich im gleichen konzeptionellen Rahmen bewegt wie das alte VB6 IsNumeric()
Funktion?
Antworten
Zu viele Anzeigen?Ich habe getestet und Michaels Lösung ist die beste. Stimmen Sie für seine Antwort oben (suchen Sie auf dieser Seite nach "If you really want to make sure that a string", um sie zu finden). Im Wesentlichen ist seine Antwort dies:
function isNumeric(num){
num = "" + num; //coerce num to be a string
return !isNaN(num) && !isNaN(parseFloat(num));
}
Es funktioniert für jeden Testfall, den ich hier dokumentiert habe: https://jsfiddle.net/wggehvp9/5/
Viele der anderen Lösungen versagen in diesen Grenzfällen: ' ', null, "", true und []. Theoretisch könnten Sie sie verwenden, zum Beispiel mit einer angemessenen Fehlerbehandlung:
return !isNaN(num);
oder
return (+num === +num);
mit Sonderbehandlung für / \s /, null, "", wahr, falsch, [] (und andere?)
Sie können das Ergebnis von Nummer bei der Übergabe eines Arguments an seinen Konstruktor.
Wenn das Argument (eine Zeichenkette) nicht in eine Zahl umgewandelt werden kann, wird NaN zurückgegeben, so dass Sie feststellen können, ob die angegebene Zeichenkette eine gültige Zahl ist oder nicht.
Anmerkungen: Hinweis bei Übergabe eines leeren Strings oder '\t\t'
y '\n\t'
as Number gibt 0 zurück; die Übergabe von true ergibt 1 und false ergibt 0.
Number('34.00') // 34
Number('-34') // -34
Number('123e5') // 12300000
Number('123e-5') // 0.00123
Number('999999999999') // 999999999999
Number('9999999999999999') // 10000000000000000 (integer accuracy up to 15 digit)
Number('0xFF') // 255
Number('Infinity') // Infinity
Number('34px') // NaN
Number('xyz') // NaN
Number('true') // NaN
Number('false') // NaN
// cavets
Number(' ') // 0
Number('\t\t') // 0
Number('\n\t') // 0
Vielleicht gibt es ein oder zwei Personen, die auf diese Frage stoßen und einen Rat brauchen wesentlich strenger prüfen als sonst (wie ich). In diesem Fall könnte dies nützlich sein:
if(str === String(Number(str))) {
// it's a "perfectly formatted" number
}
Aufgepasst! Dadurch werden Zeichenketten wie .1
, 40.000
, 080
, 00.1
. Es ist sehr wählerisch - die Zeichenkette muss mit dem " minimalste perfekte Form "der Zahl für das Bestehen dieses Tests.
Es verwendet die String
y Number
Konstruktor, um die Zeichenkette in eine Zahl und wieder zurück umzuwandeln, und prüft so, ob die "perfekte Minimalform" der JavaScript-Engine (diejenige, in die sie mit der ursprünglichen Number
Konstruktor) mit der ursprünglichen Zeichenkette übereinstimmt.
Mir gefällt die Einfachheit.
Number.isNaN(Number(value))
Das obige ist normales Javascript, aber ich verwende es in Verbindung mit einem Typescript Schreibschutz für eine intelligente Typenprüfung. Dies ist sehr nützlich für den Typescript-Compiler, um Ihnen korrekte Intellisense und keine Typfehler zu geben.
Typografische Schutzvorrichtungen
Warnung: Siehe Jeremy's Kommentar unten. Dies hat einige Probleme mit bestimmten Werten und ich habe keine Zeit, es jetzt zu reparieren, aber die Idee, einen Typeguard zu verwenden, ist nützlich, also werde ich diesen Abschnitt nicht löschen.
isNotNumber(value: string | number): value is string {
return Number.isNaN(Number(this.smartImageWidth));
}
isNumber(value: string | number): value is number {
return Number.isNaN(Number(this.smartImageWidth)) === false;
}
Angenommen, Sie haben eine Eigenschaft width
das ist number | string
. Möglicherweise möchten Sie die Logik davon abhängig machen, ob es sich um eine Zeichenkette handelt oder nicht.
var width: number|string;
width = "100vw";
if (isNotNumber(width))
{
// the compiler knows that width here must be a string
if (width.endsWith('vw'))
{
// we have a 'width' such as 100vw
}
}
else
{
// the compiler is smart and knows width here must be number
var doubleWidth = width * 2;
}
Der Typeguard ist intelligent genug, um den Typ der width
innerhalb der if
Anweisung, NUR zu sein string
. Dies ermöglicht dem Compiler, die width.endsWith(...)
was nicht möglich wäre, wenn der Typ string | number
.
Sie können den Typeguard nennen, wie Sie wollen isNotNumber
, isNumber
, isString
, isNotString
aber ich denke isString
ist etwas zweideutig und schwieriger zu lesen.
Warum ist die Implementierung von jQuery nicht gut genug?
function isNumeric(a) {
var b = a && a.toString();
return !$.isArray(a) && b - parseFloat(b) + 1 >= 0;
};
Michael schlug etwas Ähnliches vor (obwohl ich hier die abgeänderte Version von "user1691651 - John" geklaut habe):
function isNumeric(num){
num = "" + num; //coerce num to be a string
return !isNaN(num) && !isNaN(parseFloat(num));
}
Im Folgenden finden Sie eine Lösung mit wahrscheinlich schlechter Leistung, aber soliden Ergebnissen. Es ist eine Kombination aus der jQuery 1.12.4-Implementierung und Michaels Antwort, mit einer zusätzlichen Prüfung auf führende/nachlaufende Leerzeichen (weil Michaels Version true für Zahlen mit führenden/nachlaufenden Leerzeichen zurückgibt):
function isNumeric(a) {
var str = a + "";
var b = a && a.toString();
return !$.isArray(a) && b - parseFloat(b) + 1 >= 0 &&
!/^\s+|\s+$/g.test(str) &&
!isNaN(str) && !isNaN(parseFloat(str));
};
Die letztgenannte Version enthält jedoch zwei neue Variablen. Eine davon könnte man umgehen, indem man es tut:
function isNumeric(a) {
if ($.isArray(a)) return false;
var b = a && a.toString();
a = a + "";
return b - parseFloat(b) + 1 >= 0 &&
!/^\s+|\s+$/g.test(a) &&
!isNaN(a) && !isNaN(parseFloat(a));
};
Ich habe noch nicht viel davon getestet, mit anderen Mitteln als dem manuellen Testen der wenigen Anwendungsfälle, auf die ich mit meiner aktuellen Situation stoßen werde, was alles sehr standardmäßig ist. Dies ist eine "Stehen-auf-den-Schultern-der-Riesen"-Situation.