Подтвердить что ты не робот

Javascript parseFloat "500 000" возвращает 500, когда мне нужно 500000

Как это было бы хорошим способом справиться с этим?

Я уже подумал об удалении запятой, а затем разобрался в float.

Знаете ли вы лучший/более чистый способ?

Спасибо

4b9b3361

Ответ 1

Неа. Удалите запятую.

Ответ 2

parseFloat( theString.replace(/,/g,'') );

Ответ 3

Я не знаю, почему никто не предложил это выражение -

parseFloat( theString.replace(/[^\d\.]/g,'') );

Удаляет любые нечисловые символы, кроме периодов. Вам также не нужны настраиваемые функции/циклы, которые просто переполняются.

Ответ 4

Вы можете использовать метод замены строк, но не в одном лайнере, как позволяет regexp.

while(str.indexOf(',')!=-1)str= str.replace(',','');
parseFloat(str);

Или сделать одно выражение без regexp =

return parseFloat(str.split(',').join(''));

Я бы использовал регулярное выражение.

Ответ 5

У меня недостаточно репутации, чтобы добавить комментарий, но для тех, кто задается вопросом о производительности для 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 мс

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

Ответ 6

Основываясь на идее от @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.

Возможно, это не так быстро, но вам нужны альтернативы:)

Ответ 7

Как насчет простой функции для решения большинства распространенных проблем?

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, в противном случае, если он начинается с числа, он должен быть строкой, подлежащей анализу).

Попробуй... Счастливое кодирование.