2500 Stimmen

Wie wandelt man in JavaScript eine Zeichenkette in eine ganze Zahl um?

Wie konvertiere ich in JavaScript eine Zeichenkette in eine ganze Zahl?

7 Stimmen

Auf dieser Seite finden Sie unten eine gute Tabelle, in der verschiedene Umrechnungsmethoden verglichen werden: medium.com/@nikjohn/

1 Stimmen

In Ermangelung einer Klärung durch den Auftraggeber könnte diese Frage im Sinne einer Umwandlung interpretiert werden jede Zeichenkette in eine Zahl umzuwandeln, d.h. "Hund" in eine Zahl zu verwandeln (was natürlich auch möglich ist).

2 Stimmen

Er hat den Köder geschluckt: @DanielCarrera und doch hat niemand hier die Frage in diesem Sinne interpretiert. Wahrscheinlich, weil sie, wenn das das Ziel gewesen wäre, sehr wahrscheinlich ganz anders formuliert worden wäre. Schließlich wird das Verfahren, das dabei zum Einsatz kommt ("Hashing"), nicht als "Hash" bezeichnet und wurde auch nie als " Konvertierung zu einer ganzen Zahl".

3015voto

Nosredna Punkte 78203

Der einfachste Weg wäre die Verwendung der nativen Number Funktion:

var x = Number("1000")

Wenn das für Sie nicht in Frage kommt, gibt es die parseInt , unäres Plus , parseFloat mit Boden und Math.rund Methoden.

parseInt:

var x = parseInt("1000", 10); // you want to use radix 10
    // so you get a decimal number even with a leading 0 and an old browser ([IE8, Firefox 20, Chrome 22 and older][1])

unäres Plus wenn Ihre Zeichenkette bereits in Form einer Ganzzahl vorliegt:

var x = +"1000";

wenn Ihre Zeichenkette eine Fließkommazahl ist oder sein könnte und Sie eine Ganzzahl wünschen:

var x = Math.floor("1000.01"); //floor automatically converts string to number

oder, wenn Sie Math.floor mehrmals verwenden werden:

var floor = Math.floor;
var x = floor("1000.01");

Wenn Sie der Typ sind, der beim Aufruf von parseInt vergisst, das Radix einzugeben, können Sie parseFloat verwenden und den Wert nach Belieben runden. Hier verwende ich floor.

var floor = Math.floor;
var x = floor(parseFloat("1000.01"));

Interessanterweise wird Math.round (wie Math.floor) eine Zeichenkette in eine Zahl umwandeln, wenn Sie also die Zahl gerundet haben wollen (oder wenn Sie eine ganze Zahl in der Zeichenkette haben), ist dies ein großartiger Weg, vielleicht mein Favorit:

var round = Math.round;
var x = round("1000"); //equivalent to round("1000",0)

0 Stimmen

Für den letzten Fall, wenn Sie nur die Zahl abschneiden wollen (gegen Null runden), können Sie immer noch parseInt verwenden. Es wird die Zahl bis zum Punkt analysieren.

0 Stimmen

Ja. Jedes Mal, wenn ich "floor" verwende, mache ich var floor=Math.floor, was die Sache etwas strafft. Ich wollte nur zeigen, was mit unary plus passiert, wenn man einen Float hat. Es gibt immer wieder Probleme, weil 1) die Leute mit Strings enden, obwohl sie Zahlen haben wollen. 2) JavaScript verwendet "+" sowohl für die Addition als auch für die String-Verkettung.

1 Stimmen

jsperf.com/leistung-der-parseint/29 hy @jedierikb ich war edit jsperf link. Hinzufügen '4'>>0 y '4'>>>0 .

294voto

Zanoni Punkte 28468

Versuchen Sie die Funktion parseInt:

var number = parseInt("10");

Doch es gibt ein Problem. Wenn Sie versuchen, "010" mit der Funktion parseInt zu konvertieren, wird sie als Oktalzahl erkannt und gibt die Zahl 8 zurück. Sie müssen also ein Radix (von 2 bis 36) angeben. In diesem Fall zur Basis 10.

parseInt(string, radix)

Ejemplo:

var result = parseInt("010", 10) == 10; // Returns true

var result = parseInt("010") == 10; // Returns false

Beachten Sie, dass parseInt ignoriert fehlerhafte Daten, nachdem es alle gültigen geparst hat.
Diese Guid wird als 51 geparst:

var result = parseInt('51e3daf6-b521-446a-9f5b-a1bb4d8bac36', 10) == 51; // Returns true

4 Stimmen

Radix ist im Jahr 2016 nicht mehr erforderlich.

8 Stimmen

Bei neueren Browsern mag das nicht der Fall sein, aber Radix ist aus Gründen der Abwärtskompatibilität immer noch erforderlich.

0 Stimmen

Wie wäre es mit '' , oder "02" oder "02+1" , oder "03,12" oder "03.12"?

165voto

kybernetikos Punkte 7831

Es gibt zwei Möglichkeiten, eine Zeichenkette in eine Zahl in Javascript zu konvertieren. Eine Möglichkeit ist, sie zu parsen, und die andere ist, ihren Typ in eine Zahl zu ändern. Alle Tricks in den anderen Antworten (z. B. unary plus) beinhalten implizit den Typ des Strings in eine Zahl zu zwingen. Sie können das Gleiche auch explizit mit der Funktion Number tun.

Parsing

var parsed = parseInt("97", 10);

parseInt und parseFloat sind die beiden Funktionen, die zum Parsen von Strings in Zahlen verwendet werden. Das Parsen bricht stillschweigend ab, wenn es auf ein Zeichen stößt, das es nicht erkennt, was für das Parsen von Zeichenketten wie "92px" nützlich sein kann, aber es ist auch etwas gefährlich, da es bei fehlerhafter Eingabe keine Fehlermeldung ausgibt, sondern ein NaN zurückgibt, es sei denn, die Zeichenkette beginnt mit einer Zahl. Leerzeichen am Anfang des Strings werden ignoriert. Hier ist ein Beispiel dafür, dass es etwas anderes macht, als Sie wollen, und keinen Hinweis darauf gibt, dass etwas schief gelaufen ist:

var widgetsSold = parseInt("97,800", 10); // widgetsSold is now 97

Es ist gute Praxis, das Radix immer als zweites Argument anzugeben. In älteren Browsern wurde die Zeichenkette, wenn sie mit einer 0 begann, als oktal interpretiert, wenn das Radix nicht angegeben wurde, was viele Leute überraschte. Das Verhalten für Hexadezimal wird dadurch ausgelöst, dass die Zeichenkette mit 0x beginnt, wenn kein Radix angegeben wird, z. B. 0xff . Der Standard hat sich mit ecmascript 5 geändert, so dass moderne Browser bei einer führenden 0 kein Oktal mehr auslösen, wenn kein Radix angegeben wurde. parseInt versteht Radixe bis zur Basis 36, wobei sowohl Groß- als auch Kleinbuchstaben als gleichwertig behandelt werden.

Ändern des Typs einer Zeichenkette in eine Zahl

Alle anderen oben genannten Tricks, die nicht parseInt verwenden, zwingen die Zeichenkette implizit in eine Zahl. Ich ziehe es vor, dies explizit zu tun,

var cast = Number("97");

Dies hat ein anderes Verhalten als die Parse-Methoden (obwohl es immer noch Whitespace ignoriert). Sie ist strenger: Wenn sie nicht die gesamte Zeichenkette versteht, gibt sie NaN also kann man sie nicht für Zeichenketten wie 97px . Da Sie eine primitive Zahl anstelle eines Number-Wrapper-Objekts wünschen, stellen Sie sicher, dass Sie nicht new vor der Funktion Zahl.

Bei der Konvertierung in eine Zahl erhalten Sie einen Wert, der eher eine Fließkommazahl als eine ganze Zahl ist. Wenn Sie also eine ganze Zahl wollen, müssen Sie sie ändern. Hierfür gibt es mehrere Möglichkeiten:

var rounded = Math.floor(Number("97.654"));  // other options are Math.ceil, Math.round
var fixed = Number("97.654").toFixed(0); // rounded rather than truncated
var bitwised = Number("97.654")|0;  // do not use for large numbers

Jeder bitweise Operator (hier habe ich ein bitweises oder verwendet, aber man könnte auch eine doppelte Negation wie in einer früheren Antwort oder eine Bitverschiebung verwenden) konvertiert den Wert in eine 32-Bit-Ganzzahl, und die meisten von ihnen konvertieren in eine Ganzzahl mit Vorzeichen. Beachten Sie, dass dies wird bei großen ganzen Zahlen nicht den gewünschten Effekt haben . Wenn die Ganzzahl nicht in 32 Bit dargestellt werden kann, wird sie umbrochen.

~~"3000000000.654" === -1294967296
// This is the same as
Number("3000000000.654")|0
"3000000000.654" >>> 0 === 3000000000 // unsigned right shift gives you an extra bit
"300000000000.654" >>> 0 === 3647256576 // but still fails with larger numbers

Um mit größeren Zahlen korrekt zu arbeiten, sollten Sie die Rundungsmethoden verwenden

Math.floor("3000000000.654") === 3000000000
// This is the same as
Math.floor(Number("3000000000.654"))

Beachten Sie, dass Coeercion die Exponentialschreibweise und Infinity versteht, also 2e2 es 200 und nicht NaN, während die Parse-Methoden dies nicht tun.

Benutzerdefiniert

Es ist unwahrscheinlich, dass eine dieser Methoden genau das tut, was Sie wollen. Zum Beispiel möchte ich normalerweise eine Fehlermeldung erhalten, wenn das Parsing fehlschlägt, und ich brauche keine Unterstützung für Infinity, Exponentiale oder führende Leerzeichen. Je nach Anwendungsfall ist es manchmal sinnvoll, eine eigene Konvertierungsfunktion zu schreiben.

Vergewissern Sie sich immer, dass die Ausgabe von Number oder einer der Parse-Methoden die Art von Zahl ist, die Sie erwarten. Sie werden mit ziemlicher Sicherheit verwenden wollen isNaN um sicherzustellen, dass die Zahl nicht NaN ist (normalerweise die einzige Möglichkeit, um herauszufinden, dass das Parsen fehlgeschlagen ist).

8 Stimmen

Es hängt davon ab, ob Sie möchten, dass Ihr Code auch 97,8,00 und ähnliches oder nicht. Ein einfacher Trick besteht darin, eine .replace(/[^0-9]/g, "") die alle Nicht-Ziffern aus der Zeichenkette entfernt und dann die Konvertierung vornimmt. Dabei werden natürlich alle möglichen verrückten Zeichenketten ignoriert, bei denen man wahrscheinlich eher einen Fehler machen sollte, als sie einfach zu parsen...

7 Stimmen

@kybernetikos sollte wahrscheinlich sein .replace(/[^0-9.]/g, "") sonst wird aus "1,05" "105".

0 Stimmen

Allerdings würde ich so etwas ohnehin nicht für wichtigen Code verwenden - es gibt so viele Möglichkeiten, etwas durchzulassen, das man eigentlich nicht durchlassen will.

63voto

Kamil Kiełczewski Punkte 69048

Schnellste

var x = "1000"*1;

Test

Hier ein kleiner Geschwindigkeitsvergleich (nur Mac Os)... :)

Bei Chrom sind 'plus' und 'mul' am schnellsten (>700.000,00 op/sec), 'Math.floor' ist am langsamsten. Bei Firefox ist 'plus' am langsamsten (!), 'mul' ist am schnellsten (>900.000.000 op/sec). In Safari ist 'parseInt' am schnellsten, 'number' am langsamsten (aber die Ergebnisse sind recht ähnlich, >13.000.000 <31.000.000). Safari ist also bei der Umwandlung von String in Int mehr als 10x langsamer als andere Browser. Der Gewinner ist also ' mul ' :)

Sie können es über diesen Link in Ihrem Browser ausführen https://jsperf.com/js-cast-str-to-number/1

enter image description here

Update

Ich teste auch var x = ~~"1000"; - auf Chrome und Safari ist ein wenig langsamer als var x = "1000"*1 (<1%), bei Firefox ist es etwas schneller (<1%). Ich aktualisieren oben Bild und Test

8 Stimmen

Es gibt keinen signifikanten Unterschied zwischen den Ergebnissen der Tests A, B, E und F - sie sind alle im Wesentlichen identisch,

0 Stimmen

Ich habe ~~"1000" schneller auf Chrome, aber sie sind alle so nah

61voto

Dalius I Punkte 923

ParseInt() und + sind unterschiedlich

parseInt("10.3456") // returns 10

+"10.3456" // returns 10.3456

1 Stimmen

Vermutlich +"..." ist im Wesentlichen Number("...") .

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