Разбор Javascript с плавающей запятой игнорирует десятичные знаки после запятой


81

Вот простой сценарий. Я хочу показать на моем сайте вычитание двух значений:

//Value on my websites HTML is: "75,00"
var fullcost = parseFloat($("#fullcost").text()); 

//Value on my websites HTML is: "0,03"
var auctioncost = parseFloat($("#auctioncost").text());

alert(fullcost); //Outputs: 75
alert(auctioncost); //Ouputs: 0

Кто-нибудь может сказать мне, что я делаю не так?

Ответы:


159

Это «По замыслу». parseFloatФункция не будет рассматривать только те части строки вплоть до в достижении не +, -, число, экспоненты или десятичной точки. Как только он видит запятую, он перестает искать и учитывает только часть «75».

Чтобы исправить это, преобразуйте запятые в десятичные точки.

var fullcost = parseFloat($("#fullcost").text().replace(',', '.'));

9
Будет ли это работать во всех регионах? Разве запятая не используется в зависимости от ваших региональных настроек в ОС?
Душан Плавак

14
Приведенный выше код удалит только первые символы ','. Что делать, если число 700000000? Вам нужно: .replace (/, / g, '')
hyankov

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

3
Привет, а что, если ввод есть, 5.200,75что означает пять тысяч двести целых семьдесят пять.
hasan05

Этот ответ будет работать только в текущем сценарии, и если, например, число 15000, тогда будет 15, что неверно!
itsHarshad

31

parseFloat в javascript не принимает параметр локали. Поэтому вам придется заменить ,на.

parseFloat('0,04'.replace(/,/, '.')); // 0.04

19
Что делать, если число 7 000 000,15?
Питер Рэйвз

7
Вы отвечаете за то, чтобы ваши строки выглядели как плавающие, когда пытаетесь их проанализировать. Если в вашей локали используются точки для десятичных знаков, вы можете безопасно удалить все запятые (разделители тысяч), прежде чем пытаться преобразовать его в число с плавающей запятой. Если в вашей локали используются запятые вместо точек для десятичных знаков, вы можете безопасно удалить любые точки (разделители тысяч), а затем заменить запятую (десятичную точку) точкой.
Такоман Ультроман


18

parseFloatвыполняет синтаксический анализ в соответствии с определением десятичного литерала в JavaScript , а не в соответствии с определением вашего языкового стандарта. (Например, parseFloatне зависит от локали.) Десятичные литералы в JavaScript используются .для десятичной точки.


12

Как отметил @JaredPar в своем ответе, используйте parseFloatзамену

var fullcost = parseFloat($("#fullcost").text().replace(',', '.'));

Просто заменив commaс dotисправит, если это не число над тысячами , как 1.000.000,00таким образом даст вам неправильную цифру. Таким образом, вам необходимо заменить commaфайл dots.

// Remove all dot's. Replace the comma.
var fullcost = parseFloat($("#fullcost").text().replace(/\./g,'').replace(',', '.'));

Используя две замены, вы сможете работать с данными без получения неправильных цифр на выходе.


8

Лучше использовать этот синтаксис для замены всех запятых в случае миллиона 1,234,567

var string = "1,234,567";
string = string.replace(/[^\d\.\-]/g, ""); 
var number = parseFloat(string);
console.log(number)

В gсредство , чтобы удалить все запятые.

Посмотрите демо Jsfiddle здесь .


7

В числах в JS используется .символ (точка / точка) для обозначения десятичной точки, а не ,(запятая).


1

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

function preformatFloat(float){
   if(!float){
      return '';
   };

   //Index of first comma
   const posC = float.indexOf(',');

   if(posC === -1){
      //No commas found, treat as float
      return float;
   };

   //Index of first full stop
   const posFS = float.indexOf('.');

   if(posFS === -1){
      //Uses commas and not full stops - swap them (e.g. 1,23 --> 1.23)
      return float.replace(/\,/g, '.');
   };

   //Uses both commas and full stops - ensure correct order and remove 1000s separators
   return ((posC < posFS) ? (float.replace(/\,/g,'')) : (float.replace(/\./g,'').replace(',', '.')));
};
// <-- parseFloat(preformatFloat('5.200,75'))
// --> 5200.75

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


Он отлично работает для обоих форматов 1,234.56и1.234,56
joseantgv

0

В моем случае у меня уже была точка, (.)а также запятая (,), поэтому у меня сработала replaceзапятая (,)с пустой строкой, как показано ниже:

parseFloat('3,000.78'.replace(',', '')) 

Предполагается, что сумма из существующей базы данных составляет 3 000,78. Результаты: 3000.78без начальной запятой (,).


-1

Валюта страны моего происхождения выглядит как "3.050,89 €".

parseFloat идентифицирует точку как десятичный разделитель, чтобы добавить 2 значения, мы могли бы поместить это так:

parseFloat(element.toString().replace(/\./g,'').replace(',', '.'))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.