Ich habe 2,299.00
als Zeichenfolge und ich versuche, es auf eine Zahl zu analysieren. Ich habe versucht, zu verwenden parseFloat
, was zu 2 führt. Ich denke, das Komma ist das Problem, aber wie würde ich dieses Problem richtig lösen? Komma einfach entfernen?
var x = parseFloat("2,299.00")
alert(x);
javascript
number-formatting
user1540714
quelle
quelle
.replace(/,/g, '')
Folgendes verwenden : Dieser reguläre Ausdruck verwendet das Globaleg
, um alle zu ersetzen.parseFloat("2,000,000.00".replace(',',''))
Rückgaben,2000
und 2. es schlägt in vielen Regionen der Welt fehl, in denen,
es sich um eine Dezimalstelle handelt, z. B.parseFloat("2.000.000,00".replace(',',''))
Rückgaben2
- siehe meine Antwort unten für etwas, das überall auf der Welt funktioniert.Das Entfernen von Kommas ist möglicherweise gefährlich, da viele Gebietsschemas, wie andere in den Kommentaren erwähnt haben, ein Komma verwenden, um etwas anderes zu bedeuten (z. B. eine Dezimalstelle).
Ich weiß nicht, woher du deine Saite hast, aber an einigen Orten auf der Welt
"2,299.00"
=2.299
Das
Intl
Objekt hätte ein guter Weg sein können, um dieses Problem anzugehen, aber irgendwie gelang es ihnen, die Spezifikation nur mit einerIntl.NumberFormat.format()
API und ohneparse
Gegenstück zu versenden :(Die einzige Möglichkeit, eine Zeichenfolge mit darin enthaltenen kulturellen numerischen Zeichen auf eine vernünftige Weise in eine maschinenerkennbare Zahl zu analysieren, besteht darin, eine Bibliothek zu verwenden, die CLDR-Daten nutzt, um alle Möglichkeiten zur Formatierung von Zahlenzeichenfolgen abzudecken. Http: //cldr.unicode. org /
Die zwei besten JS-Optionen, die mir bisher begegnet sind:
quelle
In modernen Browsern können Sie das integrierte Intl.NumberFormat verwenden , um die Zahlenformatierung des Browsers zu erkennen und die Eingabe entsprechend zu normalisieren.
Es gibt offensichtlich Raum für Optimierungen und Caching, aber dies funktioniert zuverlässig in allen Sprachen.
quelle
Entfernen Sie alles, was keine Ziffer, kein Dezimalpunkt oder Minuszeichen ist (
-
):Geige aktualisiert
Beachten Sie, dass es für Zahlen in wissenschaftlicher Notation nicht funktioniert. Wenn Sie es wollen , die ändern
replace
Zeile hinzufügene
,E
und+
auf die Liste der zulässigen Zeichen:quelle
str = str.replace(/(\d+),(?=\d{3}(\D|$))/g, "$1");
Dies ist, was ich verwenden würde, aber ich bin bei Regex völlig nutzlos und etwas, das ich vor einiger Zeit in einem anderen SO-Thread gefunden habe.parseFloat
- was sie validiert. :-)Normalerweise sollten Sie Eingabefelder verwenden, die keine Freitexteingabe für numerische Werte zulassen. Es kann jedoch Fälle geben, in denen Sie das Eingabeformat erraten müssen. Zum Beispiel bedeutet 1,234,56 in Deutschland 1.234,56 in den USA. Unter https://salesforce.stackexchange.com/a/21404 finden Sie eine Liste der Länder, die Komma als Dezimalzahl verwenden.
Ich benutze die folgende Funktion, um eine bestmögliche Vermutung anzustellen und alle nicht numerischen Zeichen zu entfernen:
Probieren Sie es hier aus: https://plnkr.co/edit/9p5Y6H?p=preview
Beispiele:
Die Funktion hat eine Schwachstelle: Es ist nicht möglich, das Format zu erraten, wenn Sie 1.123 oder 1.123 haben - da je nach Gebietsschema-Format beide ein Komma oder ein Tausendertrennzeichen sein können. In diesem speziellen Fall behandelt die Funktion das Trennzeichen als Tausendertrennzeichen und gibt 1123 zurück.
quelle
3,00 €
auch auf 3.00 ersetzt. Nur eine Notiz, die3,001
formatiert ist3001
. Um dies zu vermeiden, sollte die Eingabe immer mit Dezimalsymbolen erfolgen. ZB3,001.00€
3,001.00
konvertiert richtig. Bitte aktualisieren Sie auch jsfiddle.0,124
Es ist immer noch zu 124 konvertiertEs ist rätselhaft , dass sie eine inbegriffen toLocaleString aber keine Parse - Methode. Zumindest toLocaleString ohne Argumente wird in IE6 + gut unterstützt.
Für eine i18n- Lösung habe ich Folgendes entwickelt:
Ermitteln Sie zuerst das Dezimaltrennzeichen für das Gebietsschema des Benutzers:
Normalisieren Sie dann die Zahl, wenn der String mehr als ein Dezimaltrennzeichen enthält:
Entfernen Sie zum Schluss alles, was keine Zahl oder kein Dezimaltrennzeichen ist:
quelle
Dies ist ein einfacher, unauffälliger Wrapper um die
parseFloat
Funktion.quelle
Wenn Sie das von David Meister gepostete Problem vermeiden möchten und sich über die Anzahl der Dezimalstellen sicher sind, können Sie alle Punkte und Kommas ersetzen und durch 100 teilen, z.
oder wenn Sie 3 Dezimalstellen haben
Es liegt an Ihnen, ob Sie parseInt, parseFloat oder Number verwenden möchten. Wenn Sie die Anzahl der Dezimalstellen beibehalten möchten, können Sie die Funktion .toFixed (...) verwenden.
quelle
Alle diese Antworten schlagen fehl, wenn Sie eine Zahl in Millionenhöhe haben.
3.456.789 würden einfach 3456 mit der Ersetzungsmethode zurückgeben.
Die richtigste Antwort zum einfachen Entfernen der Kommas müsste sein.
Oder einfach geschrieben.
quelle
Dadurch wird eine Nummer in einem beliebigen Gebietsschema in eine normale Nummer konvertiert. Funktioniert auch für Dezimalstellen:
quelle
Mit dieser Funktion können Sie Werte in verschiedenen Formaten wie
1.234,56
und1,234.56
und sogar mit Fehlern wie1.234.56
und formatieren1,234,56
quelle
Wenn Sie eine l10n-Antwort wünschen, tun Sie dies auf diese Weise. Beispiel verwendet Währung, aber das brauchen Sie nicht. Die internationale Bibliothek muss mehrfach gefüllt sein, wenn Sie ältere Browser unterstützen müssen.
quelle
replace()
nur das erste Match, wenn es nichtRegExp
mit'g'
Flag verwendet wird.,
codiert ist, der in einigen Regionen im Komma- Trennzeichen stehtErsetzen Sie das Komma durch eine leere Zeichenfolge:
quelle
Wenn Sie eine kleine Anzahl von Gebietsschemas unterstützen möchten, sind Sie wahrscheinlich besser dran, wenn Sie nur ein paar einfache Regeln fest codieren:
quelle
quelle
Die Split-Funktion teilt die Zeichenfolge mit "," als Trennzeichen in ein Array auf und gibt ein Array zurück.
Die Join-Funktion verbindet die Elemente des Arrays, die von der Split-Funktion zurückgegeben werden.
Die Funktion Number () konvertiert die verknüpfte Zeichenfolge in eine Zahl.
quelle