2012 Stimmen

Wie kann ich prüfen, ob eine Zeichenkette eine gültige Zahl ist?

Ich hoffe, dass es etwas gibt, das sich im gleichen konzeptionellen Rahmen bewegt wie das alte VB6 IsNumeric() Funktion?

17voto

JohnP2 Punkte 1711

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?)

13voto

GibboK Punkte 67729

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

11voto

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.

9voto

Simon_Weaver Punkte 129442

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.

8voto

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X