Синтаксичний аналіз Javascript ігнорує десяткові знаки після моєї коми


81

Ось простий сценарій. Я хочу показати віднімання двох значень show на моєму сайті:

//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
Чи спрацює це у всіх регіонах? Чи не використовується кома залежно від ваших регіональних налаштувань в ОС?
Душан Плавак 13.03.15

14
Наведений вище код видалить лише перше ','. Що робити, якщо число становить 700 000 000? Вам потрібно: .replace (/, / g, '')
hyankov

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

3
Привіт, що, якщо введення - 5.200,75це означає п’ять тисяч двісті і сімдесят п’ять.
hasan05

Ця відповідь працюватиме лише за поточним сценарієм, і якщо, наприклад, число дорівнює 15000, то це покаже 15, що є неправильним!
itsHarshad

31

javascript parseFloat не приймає параметр мови. Тож вам доведеться замінити ,на.

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

19
Що робити, якщо число 7 000 000.15?
Пітер Рівз

7
Ви відповідаєте за те, щоб відповідати своїм рядкам, щоб виглядати як плаваючі, при спробі їх проаналізувати. Якщо у вашій мові використовуються крапки для десяткових крапок, то ви можете безпечно вилучити всі коми (тисячі роздільників), перш ніж намагатись проаналізувати її на плаваючу. Якщо у вашій мові використовуються коми замість крапок для десяткових крапок, ви можете безпечно видалити будь-які крапки (тисячі розділювачів), а потім змінити кому (десяткову крапку) на крапку.
Ultroman the Tacoman



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(',', '')) 

Це передбачає, що сума з існуючої бази даних становить 3000,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.