Wie konvertiere ich einen String in Float in JavaScript?

255

Ich versuche, zwei Werte aus einem Datagrid zu analysieren. Die Felder sind numerisch, und wenn sie ein Komma haben (z. B. 554,20), kann ich die Zahlen nach dem Komma nicht erhalten. Ich habe es versucht parseIntund parseFloat. Wie kann ich das machen?

Kamil Kiełczewski
quelle
siehe auch: stackoverflow.com/questions/24318654
dreftymac

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(",", "."));
Jesse Rusak
quelle
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(/,/,'.'));
Stev
quelle
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(",","."))
Wadih M.
quelle
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"
sobi3ch
quelle
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,",");
Nick Benes
quelle
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;
    }
Muhammad Bilal
quelle
0

Ich hatte das gleiche Problem, außer dass ich nicht im Voraus wusste, was die Tausendertrennzeichen und das Dezimaltrennzeichen waren. Am Ende schrieb ich eine Bibliothek, um dies zu tun. Wenn Sie es hier interessieren, ist es: https://github.com/GuillaumeLeclerc/number-parsing

DARK_DUCK
quelle
-1

Versuchen

let str ="554,20";
let float = +str.replace(',','.');
let int = str.split(',').map(x=>+x);

console.log({float,int});

Kamil Kiełczewski
quelle