Wie konvertiere ich in JavaScript eine Zeichenkette in eine ganze Zahl?
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.
Wie konvertiere ich in JavaScript eine Zeichenkette in eine ganze Zahl?
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)
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.
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.
jsperf.com/leistung-der-parseint/29 hy @jedierikb ich war edit jsperf link. Hinzufügen '4'>>0
y '4'>>>0
.
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
Bei neueren Browsern mag das nicht der Fall sein, aber Radix ist aus Gründen der Abwärtskompatibilität immer noch erforderlich.
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).
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...
@kybernetikos sollte wahrscheinlich sein .replace(/[^0-9.]/g, "")
sonst wird aus "1,05" "105".
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.
var x = "1000"*1;
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
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
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.
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".
0 Stimmen
Para Nicht-Standard Standort (Bsp.
123456789.123
es123456789,12
infr-FR
) siehe diese Diskussion0 Stimmen
Um Zahlen mit anderen Zahlensystemen (z. B. Persisch/Farsi oder Arabisch) zu analysieren, siehe diese Stelle y diese Stelle .