Frage

Versuchen Sie, die folgenden in JavaScript ausführen:

parseInt('01'); //equals 1
parseInt('02'); //equals 2
parseInt('03'); //equals 3
parseInt('04'); //equals 4
parseInt('05'); //equals 5
parseInt('06'); //equals 6
parseInt('07'); //equals 7
parseInt('08'); //equals 0 !!
parseInt('09'); //equals 0 !!

Ich habe gelernt, auf die harte Weise, dass JavaScript die führende Null zeigt eine Oktal integer denkt, und da es keine "8" oder "9" in Basis-8 ist, gibt die Funktion Null ist. Wie es oder nicht, dies ist konstruktions .

Was sind die Abhilfen?

. Hinweis: Der Vollständigkeit halber, ich bin über eine Lösung zu schreiben, aber es ist eine Lösung, die ich hasse, so wenden Sie sich bitte andere / bessere Antworten veröffentlichen


Update:

Die 5. Auflage des JavaScript-Standard ( ECMA-262 ) führt eine unterbrechende Änderung, die dieses Verhalten eliminiert. Mozilla hat eine gute schreiben-up .

War es hilfreich?

Lösung

Dies ist eine gemeinsame Javascript Gotcha mit einer einfachen Lösung:

Just geben Sie die Basis oder 'radix', etwa so:

parseInt('08',10); // 8

Sie können auch verwenden Anzahl :

Number('08'); // 8

Andere Tipps

Wenn Sie weiß Ihr Wert in dem signierten 32-Bit-Integer-Bereich sein wird, dann wird ~~x in allen Szenarien die richtige Sache tun.

~~"08" === 8
~~"foobar" === 0
~~(1.99) === 1
~~(-1.99)  === -1

Wenn Sie binäre nicht (~) nachzuschlagen, die Spezifikation erfordert eine „ToInt32“ Umwandlung für das Argument, das die offensichtliche Umwandlung tut zu einem Int32 und angegeben NaN Werte auf Null zu zwingen.

Ja, das ist unglaublich hackish ist aber ist so bequem ...

Von der ParseInt Dokumentation , verwenden Sie das optionale radix Argument angeben Basis-10:

parseInt('08', 10); //equals 8
parseInt('09', 10); //equals 9

Das erscheint mich als pedantisch, verwirrend, und die ausführliche (wirklich, ein zusätzliches Argument in jedem einzelnen ParseInt?), Damit ich bin die Hoffnung, es ein besserer Weg ist.

function parseDecimal(s) { return parseInt(s, 10); }

edit: Ihre eigene Funktion zu machen, zu tun, was Sie wirklich wollen ist nur eine Option, wenn Sie nicht wie das Hinzufügen des“, 10" die ganze Zeit auf die parseInt () -Aufruf. Es hat den Nachteil, daß eine Nicht-Standard-Funktion sein. Bequemer für Sie, wenn Sie es viel benutzen, aber vielleicht mehr verwirrend für andere

Geben Sie die Basis:

var number = parseInt(s, 10);

Wäre es sehr frech sein ParseInt zu ersetzen mit einer Version, die dezimal annimmt, wenn es keinen zweiten Parameter hat? (Anmerkung - nicht getestet)

parseIntImpl = parseInt
parseInt = function(str, base){return parseIntImpl(str, base ? base : 10)}

Wie wäre es damit für dezimal:

('09'-0) === 9  // true

('009'-0) === 9 // true
  

Sie können auch anstelle der Verwendung parseFloat oder parseInt, verwenden Sie den unären Operator ( + ).

+"01"
// => 1

+"02"
// => 2

+"03"
// => 3

+"04"
// => 4

+"05"
// => 5

+"06"
// => 6

+"07"
// => 7

+"08"
// => 8

+"09"
// => 9

und für eine gute Maßnahme

+"09.09"
// => 9.09

MDN Link-

  

Der unäre Plus-Operator vorangeht seinen Operanden und wertet seine Operanden, sondern versucht, sie in eine Zahl zu konvertieren, wenn es nicht bereits ist. Obwohl einstellige Negation (-) auch nicht-Zahlen umwandeln kann, unären Plus ist die schnellste und bevorzugte Weg, etwas in eine Anzahl Umwandlung , weil es keine anderen Vorgänge auf der Anzahl nicht durchführen

Wenn Sie eine Reihe von Codierung bereits mit parseInt getan haben und wollen nicht hinzufügen“, 10" , um alles, können Sie einfach die Funktion außer Kraft setzen Basis zu machen 10 der Standard:

window._oldParseInt = window.parseInt;
window.parseInt = function(str, rad) {
    if (! rad) {
        return _oldParseInt(str, 10);
    }
    return _oldParseInt(str, rad);
};

Das kann einen späteren Leser verwirren, so eine parseInt10 () Funktion machen könnte mehr selbsterklärend sein. Persönlich bevorzuge ich eine einfache Funktion als hinzufügen zu müssen“, 10" die ganze Zeit - nur mehr Möglichkeiten schafft für Fehler

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top