Как преобразовать строку в float в JavaScript?

255

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

Камил Келчевски
источник
см. также: stackoverflow.com/questions/24318654
dreftymac

Ответы:

371

Если они предназначены для отдельных значений, попробуйте это:

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

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

var value = parseFloat("554,20".replace(",", "."));
Джесси Русак
источник
6
А где у вас запятая в качестве разделителя тысяч? Например, 1234 написано как 1234
Крис Б,
6
Вы можете просто удалить запятую, а затем разобрать ее. (например, заменить его на "")
Джесси Русак
7
это не очень безопасно, так как sconto = parseFloat ("5, 5" .replace (",", ".")); возвращает 5 ведущих, считая, что это действительное число, но вы потеряете часть .5, или вы можете считать, что это не действительное число
max4ever
1
@ max4ever Если вы беспокоитесь о том, чтобы молча принимать недействительные номера, вы можете использовать +(string)вместо того, parseString(string)что предложено @Stev ниже. Итак, первый пример будет v1 = +(values[0]); v2 = +(values[1]);.
Джесси Русак
1
Не удалось, что если мой номер 6.000.000. Функция заменить только заменить первый разделитель запятой
GusDeCooL
55

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

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

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

Handy!

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

var floatValue = +(str.replace(/,/,'.'));
Стеф
источник
7
Мне очень нравится +(str)решение - parseFloatигнорирует недопустимые символы после числа, +(str)возвращает NaNв тех случаях, что именно то, что мне нужно.
Алекс
34

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

Это вернет только 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(",","."))
Вадих М.
источник
Что насчет "." разделитель тысяч? Как 4.554,20, что бы вернуться ...?
Педро Феррейра
16

Если вы расширяете объект String, как это ..

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

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

"554,20".float()
> 554.20

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

"554.20".float()
> 554.20

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

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

var str = '6.000.000';
str.replace(/[.]/g,",");
Ник Бенес
источник
1
да, замена без регулярного выражения только заменяет одно вхождение символа.
Аухан
2

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

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;
    }
Мухаммед Билал
источник
0

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

DARK_DUCK
источник
-1

Пытаться

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

console.log({float,int});

Камил Келчевски
источник