Як перетворити рядок у float у JavaScript?


255

Я намагаюся проаналізувати два значення із сітки даних. Поля є числовими, і коли у них є кома (напр. 554,20), я не можу отримати числа після коми. Я спробував parseIntі parseFloat. Як я можу це зробити?


Відповіді:


371

Якщо вони мають бути окремими значеннями, спробуйте це:

var values = "554,20".split(",")
var v1 = parseFloat(values[0])
var v2 = parseFloat(values[1])

Якщо вони означають одне значення (наприклад, французькою мовою, де написано половину 0,5)

var value = parseFloat("554,20".replace(",", "."));

6
А як там, де у вас є кома, яка використовується як тисяча сепараторів? Напр. 1234 р. Написано як 1,234
Кріс Б

6
Можна просто зняти кому, а потім розібрати її. (напр. замініть його на "")
Джессі Русак

7
це не дуже безпечно, оскільки sconto = parseFloat ("5, 5" .replace (",", ".")); повертає 5 провідних, хто вважає, що це дійсне число, але ви втратите частину .5, або ви можете вважати, що це
неправдиве

1
@ max4ever Якщо ви турбуєтесь про мовчазне прийняття недійсних номерів, ви можете використовувати +(string)замість parseString(string)запропонованого нижче @Stev нижче. Отже, перший приклад був би v1 = +(values[0]); v2 = +(values[1]);.
Джессі Русак

1
ЗБІЙ, що , якщо мій номер 6.000.000. Функція заміни лише замінити перший роздільник комами
GusDeCooL

55

Ви коли-небудь намагалися це зробити? : с

var str = '3.8';ie
alert( +(str) + 0.2 );

+ (string) передасть рядок у float.

Зручно!

Отже, щоб вирішити свою проблему, ви можете зробити щось подібне:

var floatValue = +(str.replace(/,/,'.'));

7
Мені дуже подобається +(str)рішення - parseFloatігнорує недійсні символи після числа, +(str)повертає NaNв тих випадках, саме це мені і потрібно.
Олексій

34

Замініть кому крапкою.

Це поверне лише 554:

var value = parseFloat("554,20")

Це поверне 554,20:

var value = parseFloat("554.20")

Отже, зрештою, ви можете просто використовувати:

var fValue = parseFloat(document.getElementById("textfield").value.replace(",","."))

Не забувайте, що їх parseInt()слід використовувати лише для розбору цілих чисел (без плаваючих точок). У вашому випадку він поверне лише 554. Крім того, виклик parseInt () на поплавці не буде округляти число: він займе своє слово (найближче нижнє ціле число).


Розширений приклад, щоб відповісти на запитання Педро Феррейри з коментарів:

Якщо текстове поле містить тисячі розділових точок, як у 1.234.567,99цих, можна заздалегідь усунути іншу replace:

var fValue = parseFloat(document.getElementById("textfield").value.replace(/\./g,"").replace(",","."))

Як щодо "". роздільник тисяч? Як 4.554,20, що б повернути ...?
Педро Феррейра

16

Якщо ви розширите такий об'єкт String ..

String.prototype.float = function() { 
  return parseFloat(this.replace(',', '.')); 
}

.. можна запустити так

"554,20".float()
> 554.20

також працює з крапкою

"554.20".float()
> 554.20

typeof "554,20".float()
> "number"

10
Хоча зазвичай вважається поганою формою модифікацію прототипів базового об'єкта. Що робити, якщо інший фреймворк також намагався це зробити, але функціональність відрізнялася?
фрікхед

3

@GusDeCool або хто - то інший намагається замінити більш ніж один роздільники тисяч, один з способів зробити це є регулярний вираз глобальної заміни: /foo/g. Просто пам’ятайте, що .це метахарактер, тому вам доведеться уникнути цього або помістити його в дужки ( \.або [.]). Ось один варіант:

var str = '6.000.000';
str.replace(/[.]/g,",");

1
Так, заміна без регулярного вираження замінює лише одне виникнення символу.
Авхан

2

Ви можете використовувати цю функцію. Він замінить коми на '', а потім буде розбирати значення Flaot і після цього знову коригуватиме коси у значенні.

function convertToFloat(val) {
        if (val != '') {
            if (val.indexOf(',') !== -1)
                val.replace(',', '');
            val = parseFloat(val);
            while (/(\d+)(\d{3})/.test(val.toString())) {
                val = val.toString().replace(/(\d+)(\d{3})/, '$1' + ',' + '$2');
            }
        }
        return val;
    }

0

У мене була така ж проблема, за винятком того, що я не знав заздалегідь, що це тисячні роздільники та десятковий роздільник. Я закінчив писати бібліотеку для цього. Якщо вас це цікавить, це: https://github.com/GuillaumeLeclerc/number-parsing


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.