Как это было бы хорошим способом справиться с этим?
Я уже подумал об удалении запятой, а затем разобрался в float.
Знаете ли вы лучший/более чистый способ?
Спасибо
Как это было бы хорошим способом справиться с этим?
Я уже подумал об удалении запятой, а затем разобрался в float.
Знаете ли вы лучший/более чистый способ?
Спасибо
Неа. Удалите запятую.
parseFloat( theString.replace(/,/g,'') );
Я не знаю, почему никто не предложил это выражение -
parseFloat( theString.replace(/[^\d\.]/g,'') );
Удаляет любые нечисловые символы, кроме периодов. Вам также не нужны настраиваемые функции/циклы, которые просто переполняются.
Вы можете использовать метод замены строк, но не в одном лайнере, как позволяет regexp.
while(str.indexOf(',')!=-1)str= str.replace(',','');
parseFloat(str);
Или сделать одно выражение без regexp =
return parseFloat(str.split(',').join(''));
Я бы использовал регулярное выражение.
У меня недостаточно репутации, чтобы добавить комментарий, но для тех, кто задается вопросом о производительности для regex vs split/join, вот быстрая скрипка: https://jsfiddle.net/uh3mmgru/
var test = "1,123,214.19";
var t0 = performance.now();
for (var i = 0; i < 1000000; i++)
{
var a = parseFloat(test.replace(/,/g,''));
}
var t1 = performance.now();
document.write('Regex took: ' + (t1 - t0) + ' ms');
document.write('<br>')
var t0 = performance.now();
for (var i = 0; i < 1000000; i++)
{
var b = parseFloat(test.split(',').join(''));
}
var t1 = performance.now();
document.write('Split/join took: ' + (t1 - t0) + ' ms');
Полученные результаты (для 1 миллиона циклов):
Regex: 263.335 ms
Split/join: 1035.875 мс
Поэтому я думаю, что можно с уверенностью сказать, что регулярное выражение - это способ пойти в этом сценарии
Основываясь на идее от @kennebec, если вы хотите убедиться, что запятые верны, и вы не хотите заменять запятые, вы можете попробовать что-то вроде этого:
function myParse(num) {
var n2 = num.split(",")
out = 0
for(var i = 0; i < n2.length; i++) {
out *= 1000;
out += parseFloat(n2[i])
}
return out
}
alert(myParse("1,432,85"));
// Returns 1432085, as the comma is misplaced.
Возможно, это не так быстро, но вам нужны альтернативы:)
Как насчет простой функции для решения большинства распространенных проблем?
function getValue(obj) {
Value = parseFloat( $(obj).val().replace(/,/g,'') ).toFixed(2);
return +Value;
}
Вышеприведенная функция получает значения из полей (используя jQuery) при условии, что введенные значения являются числовыми (я скорее проверяю поля, пока пользователь вводит данные, поэтому я уверен, что полевое содержимое является числовым).
В случае значений с плавающей запятой, если они хорошо отформатированы в поле, функция вернет значение с плавающей точкой правильно.
Эта функция далека от завершения, но она быстро исправляет ошибку < , "(запятая) для значений, введенных как 1,234,56 или 1,234,567. Он вернет действительный номер, пока содержимое будет числовым.
Значок + (плюс) перед переменной Значение в команде return представляет собой "грязный трюк", используемый в JavaScript, чтобы гарантировать, что возвращаемое переменное содержимое будет числовым.
легко изменить функцию для других целей, например (например), преобразовать строки в числовые значения, соблюдая "," (запятая) вопрос:
function parseValue(str) {
Value = parseFloat( str.replace(/,/g,'') ).toFixed(2);
return +Value;
}
Обе операции могут быть объединены в одну функцию. То есть:.
function parseNumber(item,isField=false) {
Value = (isField) ? parseFloat( $(item).val().replace(/,/g,'') ).toFixed(2) : parseFloat( item.replace(/,/g,'') ).toFixed(2)
return +Value;
}
В таком случае, если функция называется result = parseNumber ('12, 092.98 ');, она будет анализировать значение, поскольку оно является String. Но если вызывается как result = parseNumber ('# MyField', true),, он попытается получить значение от '# MyField'.
Как я уже говорил, такие функции далеки от завершения и могут быть расширены разными способами. Одна идея состоит в том, чтобы проверить первый символ данного параметра (строки) и принять решение на основе формата строки, где для получения значения, которое должно быть проанализировано (если 1-й символ = '#', то это ID из объекта DOM, в противном случае, если он начинается с числа, он должен быть строкой, подлежащей анализу).
Попробуй... Счастливое кодирование.