Преобразование строки с точкой или запятой в качестве десятичного разделителя в число в JavaScript
элемент ввода содержит числа a, где запятая или точка используется в качестве десятичного разделителя, а пробел может использоваться для группировки тысяч, как это:
'1,2'
'110 000,23'
'100 1.23'
Как преобразовать их в число float в браузере с помощью JavaScript?
jQuery и jQuery UI используются. Number(string)
возвращает Нэн и parseFloat()
останавливается на первом пробеле или запятой.
8 ответов
идеальным решением
accounting.js
- это крошечная библиотека JavaScript для форматирования чисел, денег и валюты.
Я понимаю, что опоздал на вечеринку, но мне нужно было решение для этого, которое правильно обрабатывало группировку цифр, а также различные десятичные разделители для валют. Поскольку ни один из них не полностью охватывал мой вариант использования, я написал свое собственное решение, которое может быть полезно другим:
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);
я использовал регулярное выражение в первом, чтобы соответствовать всем пробелам, а не только первому.
все другие решения требуют, чтобы вы знали формат заранее. Мне нужно было обнаружить(!) формат в каждом случае, и это то, что я в конечном итоге.
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