Преобразование строки с точкой или запятой в качестве десятичного разделителя в число в JavaScript

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

'1,2'
'110 000,23'
'100 1.23'

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

jQuery и jQuery UI используются. Number(string) возвращает Нэн и parseFloat() останавливается на первом пробеле или запятой.

8 ответов


сначала выполните замену:

parseFloat(str.replace(',','.').replace(' ',''))

идеальным решением

accounting.js - это крошечная библиотека JavaScript для форматирования чисел, денег и валюты.

проверьте это для ref


Я понимаю, что опоздал на вечеринку, но мне нужно было решение для этого, которое правильно обрабатывало группировку цифр, а также различные десятичные разделители для валют. Поскольку ни один из них не полностью охватывал мой вариант использования, я написал свое собственное решение, которое может быть полезно другим:

function parsePotentiallyGroupedFloat(stringValue) {
    stringValue = stringValue.trim();
    var result = stringValue.replace(/[^0-9]/g, '');
    if (/[,\.]\d{2}$/.test(stringValue)) {
        result = result.replace(/(\d{2})$/, '.');
    }
    return parseFloat(result);
}

это должно вычеркнуть любые не-цифры, а затем проверить, есть ли десятичная точка (или запятая), за которой следуют две цифры, и при необходимости вставить десятичную точку.

стоит отметить, что я нацелено это специально для валюты и как таковой не предполагает либо десятичных знаков, либо ровно двух. Довольно трудно быть уверенным в том, является ли первая потенциальная десятичная точка десятичной точкой или символом группировки цифр (например,1.542 может быть 1542) Если вы не знаете специфику текущей локали, но это должно быть достаточно легко адаптировать это к вашему конкретному варианту использования, изменив \d{2}$ к чему-то, что будет соответствующим образом соответствовать тому, что вы ожидаете после десятичная точка.


вы можете заменить все пробелы пустой строкой, все комы точками, а затем проанализировать ее.

var str = "110 000,23";
var num = parseFloat(str.replace(/\s/g, "").replace(",", "."));
console.log(num);

я использовал регулярное выражение в первом, чтобы соответствовать всем пробелам, а не только первому.


Это лучшее решение

http://numeraljs.com/

numeral().unformat('0.02'); = 0.02

о:

parseFloat(str.replace(' ', '').replace('.', '').replace(',', '.'));

все другие решения требуют, чтобы вы знали формат заранее. Мне нужно было обнаружить(!) формат в каждом случае, и это то, что я в конечном итоге.

function detectFloat(source) {
    let float = accounting.unformat(source);
    let posComma = source.indexOf(',');
    if (posComma > -1) {
        let posDot = source.indexOf('.');
        if (posDot > -1 && posComma > posDot) {
            let germanFloat = accounting.unformat(source, ',');
            if (Math.abs(germanFloat) > Math.abs(float)) {
                float = germanFloat;
            }
        } else {
            // source = source.replace(/,/g, '.');
            float = accounting.unformat(source, ',');
        }
    }
    return float;
}

это было протестировано со следующими случаями:

        const cases = {
            "0": 0,
            "10.12": 10.12,
            "222.20": 222.20,
            "-222.20": -222.20,
            "+222,20": 222.20,
            "-222,20": -222.20,
            "-2.222,20": -2222.20,
            "-11.111,20": -11111.20,
        };

предложения приветствуются.


от номера к строке валюты легко через количество.прототип.методом tolocalestring. Однако, как представляется, распространенной проблемой является обратное. Разделитель тысяч и десятичная точка не могут быть получены в стандарте JS.

в этом конкретном вопросе разделитель-это пробел " " но во многих случаях это может быть период с "." и десятичная точка может быть запятой ",". Например, в 1 000 000,00 или 1.000.000,00. Тогда вот как я превращаю его в правильное число с плавающей запятой.

var price = "1 000.000,99",
    value = +price.replace(/(\.|\s)|(\,)/g,(m,p1,p2) => p1 ? "" : ".");
console.log(value);

таким образом, обратный вызов заменителя принимает "1.000.000,00" и преобразует его в "1000000.00". После этого + в передней части результирующей строки coerces его в число.

эта функция на самом деле очень удобно. Например, если вы замените p1 = "" часть p1 = "," в функции обратного вызова, ввод 1.000.000,00 в результате 1,000,000.00