Как преобразовать строку в число с плавающей запятой в JavaScript?

Я пытаюсь разобрать два значения из таблицы данных. Поля числовые, и когда в них есть запятая (например, 554,20), я не могу получить числа после запятой. Я пробовал parseInt и parseFloat. Как я могу это сделать?


person Community    schedule 13.03.2009    source источник
comment
см. также: stackoverflow.com/questions/24318654   -  person dreftymac    schedule 20.06.2014


Ответы (9)


Если они должны быть отдельными значениями, попробуйте следующее:

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

Если они должны быть одним значением (например, во французском языке, где половина написана 0,5)

var value = parseFloat("554,20".replace(",", "."));
person Jesse Rusak    schedule 13.03.2009
comment
Как насчет того, где у вас есть запятая, используемая в качестве разделителя тысяч? Например. 1234 записывается как 1,234 - person Chris B; 26.06.2009
comment
Вы можете просто удалить запятую, а затем проанализировать ее. (например, заменить на) - person Jesse Rusak; 30.06.2009
comment
это не очень безопасно, так как sconto = parseFloat (5,, 5.replace (,,.)); возвращает 5, ведущую к единице, чтобы считать, что это действительное число, но вы теряете часть 0,5 или можете считать, что это недопустимое число - person max4ever; 01.04.2011
comment
@ max4ever Если вас беспокоит молчаливый прием неверных номеров, вы можете использовать +(string) вместо parseString(string), как предлагает @Stev ниже. Итак, первым примером будет v1 = +(values[0]); v2 = +(values[1]);. - person Jesse Rusak; 08.11.2012
comment
FAIL, что, если мой номер 6.000.000. Функция заменить только первый разделитель запятой - person GusDeCooL; 18.09.2013
comment
Используйте регулярное выражение в качестве первого параметра с флагом g, чтобы выполнить глобальную замену строки. например string.replace(/,/g, '.'). - person mAAdhaTTah; 20.01.2017

Вы когда-нибудь пробовали это делать? :п

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

+ (строка) преобразует строку в число с плавающей запятой.

Удобно!

Итак, чтобы решить вашу проблему, вы можете сделать что-то вроде этого:

var floatValue = +(str.replace(/,/,'.'));
person Stev    schedule 14.04.2011
comment
Мне очень нравится решение +(str) - parseFloat игнорирует недопустимые символы после числа, +(str) в этих случаях возвращает NaN, что мне и нужно. - person Alex; 28.05.2012

Замените запятую точкой.

Это вернет только 554:

var value = parseFloat("554,20")

Это вернет 554.20:

var value = parseFloat("554.20")

В конце концов, вы можете просто использовать:

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

Не забывайте, что parseInt() следует использовать только для анализа целых чисел (без чисел с плавающей запятой). В вашем случае он вернет только 554. Кроме того, вызов parseInt () для числа с плавающей запятой не будет округлять число: он будет занимать его пол (ближайшее меньшее целое число).


Расширенный пример ответа на вопрос Педро Феррейры из комментариев:

Если текстовое поле содержит точки-разделители тысяч, как в 1.234.567,99, их можно заранее удалить с помощью другого replace:

var fValue = parseFloat(document.getElementById("textfield").value.replace(/\./g,"").replace(",","."))
person Wadih M.    schedule 13.03.2009
comment
Что насчет . разделитель тысяч? Например, 4.554,20 что бы вернуть ...? - person Pedro Ferreira; 30.11.2015

Если вы расширите объект String следующим образом ..

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

.. вы можете запустить это так

"554,20".float()
> 554.20

работает и с точкой

"554.20".float()
> 554.20

typeof "554,20".float()
> "number"
person sobi3ch    schedule 13.07.2012
comment
Хотя обычно считается дурным тоном изменять прототипы базовых объектов. Что, если бы другой фреймворк также попытался сделать это, но функциональность отличалась? - person phreakhead; 22.01.2013

@GusDeCool или кто-либо другой, пытающийся заменить более одной тысячи разделителей, один из способов сделать это - глобальная замена регулярного выражения: /foo/g. Просто помните, что . - это метасимвол, поэтому вам нужно убрать его или заключить в квадратные скобки (\. или [.]). Вот один из вариантов:

var str = '6.000.000';
str.replace(/[.]/g,",");
person Nick Benes    schedule 13.01.2014
comment
да, замена без регулярного выражения заменяет только одно вхождение символа. - person Aukhan; 18.03.2016

Вы можете использовать эту функцию. Он заменит запятые на '', а затем проанализирует значение, а после этого снова изменит запятые в значении.

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;
    }
person Muhammad Bilal    schedule 25.02.2016

У меня была та же проблема, за исключением того, что я не знал заранее, что такое разделители тысяч и десятичный разделитель. В итоге я написал библиотеку для этого. Если вас это интересует, вот оно: https://github.com/GuillaumeLeclerc/number-parsing

person DARK_DUCK    schedule 03.05.2015

Пытаться

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

console.log({float,int});

person Kamil Kiełczewski    schedule 23.04.2019

Если кто-то ищет способ разобрать float из произвольной строки,

это можно сделать так:

function extractFloat(text) {
  const match = text.match(/\d+((\.|,)\d+)?/)
  return match && match[0]
}

extractFloat('some text with float 5.25') // 5.25
person Code4Art    schedule 24.12.2020