Jak przekonwertować ciąg na zmiennoprzecinkowy w JavaScript?

255

Próbuję przeanalizować dwie wartości z siatki danych. Pola są numeryczne, a gdy mają przecinek (np. 554,20), nie mogę uzyskać liczb po przecinku. Próbowałem parseInti parseFloat. W jaki sposób mogę to zrobić?

Kamil Kiełczewski
źródło
patrz także: stackoverflow.com/questions/24318654
dreftymac

Odpowiedzi:

371

Jeśli mają to być osobne wartości, spróbuj tego:

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

Jeśli mają być pojedynczą wartością (jak w języku francuskim, gdzie połowa jest zapisana 0,5)

var value = parseFloat("554,20".replace(",", "."));
Jesse Rusak
źródło
6
Co powiesz na to, gdzie masz przecinek używany jako separator tysiąca? Np. 1234 napisany jako 1234
Chris B
6
Możesz po prostu usunąć przecinek, a następnie go przeanalizować. (np. zamień na „”)
Jesse Rusak
7
nie jest zbyt bezpieczne, ponieważ sconto = parseFloat („5,, 5” .replace („,”, „.”)); zwraca 5 wiodącą, która uważa, że ​​jest to poprawna liczba, ale tracisz część .5 lub możesz uznać, że nie jest to poprawna liczba
max4ever
1
@ max4ever Jeśli martwisz się cichym przyjmowaniem nieprawidłowych numerów, możesz użyć +(string)zamiast parseString(string)sugerowanego przez @Stev poniżej. Tak więc pierwszym przykładem byłby v1 = +(values[0]); v2 = +(values[1]);.
Jesse Rusak
1
FAIL, co jeśli mój numer to 6.000.000. Funkcja zamiany zastępuje tylko pierwszy separator przecinków
GusDeCooL 17.09.13
55

Czy kiedykolwiek próbowałeś to zrobić? : p

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

+ (ciąg) wyrzuci ciąg do pływaka.

Poręczny!

Aby rozwiązać problem, możesz zrobić coś takiego:

var floatValue = +(str.replace(/,/,'.'));
Stev
źródło
7
Naprawdę podoba mi się +(str)rozwiązanie - parseFloatignoruje niepoprawne znaki po numerze, +(str)zwraca NaNw tych przypadkach, co jest dokładnie tym, czego potrzebuję.
Alex
34

Zastąp przecinek kropką.

Zwróci tylko 554:

var value = parseFloat("554,20")

Zwróci 554,20:

var value = parseFloat("554.20")

W końcu możesz po prostu użyć:

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

Nie zapomnij o tym parseInt() należy go używać tylko do analizowania liczb całkowitych (bez zmiennoprzecinkowych). W twoim przypadku zwróci tylko 554. Dodatkowo wywołanie parseInt () na liczbach zmiennoprzecinkowych nie zaokrągli liczby: zajmie jej podłogę (najbliższa dolna liczba całkowita).


Rozszerzony przykład odpowiedzi na pytanie Pedro Ferreiry z komentarzy:

Jeśli pole tekstowe zawiera tysiące kropek separujących, tak jak w 1.234.567,99tych, można je wcześniej usunąć za pomocą innej replace:

var fValue = parseFloat(document.getElementById("textfield").value.replace(/\./g,"").replace(",","."))
Wadih M.
źródło
A co z "." separator tysięcy? Jak 4,554,20 co by powróciło ...?
Pedro Ferreira
16

Jeśli rozszerzysz obiekt String w ten sposób ..

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

.. możesz uruchomić to w ten sposób

"554,20".float()
> 554.20

działa również z kropką

"554.20".float()
> 554.20

typeof "554,20".float()
> "number"
sobi3ch
źródło
10
Chociaż zwykle uważa się, że modyfikacja prototypów obiektów podstawowych jest złą formą. Co jeśli inny framework również spróbuje to zrobić, ale funkcjonalność będzie się różnić?
phreakhead
3

@GusDeCool lub ktoś próbuje zastąpić więcej niż jeden tysięcy separatory, jednym ze sposobów, aby to zrobić jest regex globalny wymienić: /foo/g. Pamiętaj tylko, że .jest to metaznak, więc musisz uciec lub umieścić go w nawiasach ( \.lub [.]). Oto jedna opcja:

var str = '6.000.000';
str.replace(/[.]/g,",");
Nick Benes
źródło
1
tak, zamień bez wyrażenia regularnego zastępuje tylko jedno wystąpienie znaku.
Aukhan,
2

Możesz użyć tej funkcji. Zastąpi przecinki znakiem „”, a następnie przeanalizuje wartość Flaot, a następnie ponownie dostosuje wartość przecinków.

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
źródło
-1

Próbować

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

console.log({float,int});

Kamil Kiełczewski
źródło