Wie konvertiere ich einen String in Float in JavaScript?


Antworten:


371

Wenn es sich um separate Werte handelt, versuchen Sie Folgendes:

var values = "554,20".split(",")
var v1 = parseFloat(values[0])
var v2 = parseFloat(values[1])

Wenn sie ein einzelner Wert sein sollen (wie auf Französisch, wo die Hälfte mit 0,5 geschrieben ist)

var value = parseFloat("554,20".replace(",", "."));

6
Was ist mit dem Komma, das als Tausendertrennzeichen verwendet wird? ZB 1234 geschrieben als 1.234
Chris B

6
Sie können das Komma einfach entfernen und dann analysieren. (zB durch "" ersetzen)
Jesse Rusak

7
es ist nicht sehr sicher, da sconto = parseFloat ("5 ,, 5" .replace (",", ".")); Gibt 5 zurück, was zu der Annahme führt, dass es sich um eine gültige Zahl handelt, aber Sie verlieren den .5-Teil oder Sie könnten
annehmen, dass

1
@ max4ever Wenn Sie Bedenken haben, ungültige Nummern stillschweigend zu akzeptieren, können Sie diese +(string)anstelle der parseString(string)von @Stev unten vorgeschlagenen verwenden. Das erste Beispiel wäre also v1 = +(values[0]); v2 = +(values[1]);.
Jesse Rusak

1
FAIL, was ist, wenn meine Nummer ist 6.000.000. Funktion ersetzen nur das erste Komma-Trennzeichen ersetzen
GusDeCooL

55

Haben Sie jemals versucht, dies zu tun? : p

var str = '3.8';ie
alert( +(str) + 0.2 );

+ (string) wandelt den String in float um.

Praktisch!

Um Ihr Problem zu lösen, können Sie Folgendes tun:

var floatValue = +(str.replace(/,/,'.'));

7
Die +(str)Lösung gefällt mir sehr gut - parseFloatignoriert ungültige Zeichen nach der Nummer und +(str)kehrt NaNin diesen Fällen zurück, was genau das ist, was ich brauche.
Alex

34

Ersetzen Sie das Komma durch einen Punkt.

Dies gibt nur 554 zurück:

var value = parseFloat("554,20")

Dies gibt 554,20 zurück:

var value = parseFloat("554.20")

Am Ende können Sie also einfach Folgendes verwenden:

var fValue = parseFloat(document.getElementById("textfield").value.replace(",","."))

Vergessen Sie nicht, dass dies parseInt()nur zum Parsen von Ganzzahlen (keine Gleitkommazahlen) verwendet werden sollte. In Ihrem Fall wird nur 554 zurückgegeben. Wenn Sie parseInt () auf einem Float aufrufen, wird die Zahl nicht gerundet: Sie nimmt ihren Boden ein (nächste untere Ganzzahl).


Erweitertes Beispiel zur Beantwortung der Frage von Pedro Ferreira aus den Kommentaren:

Wenn das Textfeld Tausende Trennpunkte wie in 1.234.567,99diesen enthält, können diese zuvor mit einem anderen entfernt werden replace:

var fValue = parseFloat(document.getElementById("textfield").value.replace(/\./g,"").replace(",","."))

Was ist mit "." Tausendertrennzeichen? Wie 4.554,20 was würde zurückkehren ...?
Pedro Ferreira

16

Wenn Sie das String-Objekt wie folgt erweitern.

String.prototype.float = function() { 
  return parseFloat(this.replace(',', '.')); 
}

.. Sie können es so ausführen

"554,20".float()
> 554.20

funktioniert auch mit dot

"554.20".float()
> 554.20

typeof "554,20".float()
> "number"

10
Obwohl es normalerweise als schlechte Form angesehen wird, die Prototypen des Basisobjekts zu modifizieren. Was wäre, wenn ein anderes Framework dies ebenfalls versuchen würde, die Funktionalität jedoch unterschiedlich wäre?
Phreakhead

3

@GusDeCool oder jeder andere, der versucht, mehr als tausend Trennzeichen zu ersetzen. Eine Möglichkeit, dies zu tun, ist ein globaler Regex-Ersatz : /foo/g. Denken Sie daran, dass dies .ein Metazeichen ist, also müssen Sie ihm entkommen oder in Klammern ( \.oder [.]) setzen. Hier ist eine Option:

var str = '6.000.000';
str.replace(/[.]/g,",");

1
Ja, ein Ersetzen ohne Regex ersetzt nur ein Vorkommen des Zeichens.
Aukhan

2

Sie können diese Funktion verwenden. Es ersetzt die Kommas durch '' und parseFlaot den Wert. Danach werden die Kommas erneut angepasst.

function convertToFloat(val) {
        if (val != '') {
            if (val.indexOf(',') !== -1)
                val.replace(',', '');
            val = parseFloat(val);
            while (/(\d+)(\d{3})/.test(val.toString())) {
                val = val.toString().replace(/(\d+)(\d{3})/, '$1' + ',' + '$2');
            }
        }
        return val;
    }


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.