Как избежать eval для преобразования строки в десятичное - PullRequest
1 голос
/ 13 июля 2011

У меня есть "1/7" и я хочу получить десятичный эквивалент. Конечно, я могу использовать eval ("1/7"), но, учитывая, что eval - это зло, любой другой метод?

Ответы [ 5 ]

6 голосов
/ 13 июля 2011

Эвал не зло. Плохо использовать его на произвольных строках без проверки ввода.

3 голосов
/ 13 июля 2011

Вы можете написать свою собственную функцию, она не очень сложная и довольно эффективная:

function ParseFloat(sFloat) {
    var parts = sFloat.split("/");
    if (parts.length == 2) {
        var first = parseInt(parts[0], 10);
        var second = parseInt(parts[1], 10);
        if (!isNaN(first) && !isNaN(second))
            return first / second;
    }
    return NaN;
}

Использование:

var s = "1/7";
alert(ParseFloat(s));

Тестовый пример в реальном времени: http://jsfiddle.net/RK3zS/

Редактировать: если вы работаете с такими объектами, я бы использовал для этого "класс", например:

function DecimalFraction(first, second) {
    this.first = first;
    this.second = second;
    this.toString = function() {
        return first / second;
    }
}

А затем:

var s = new DecimalFraction(3, 7);
alert(s);

Более элегантно, на мой взгляд,Обновлено jsFiddle .

1 голос
/ 13 июля 2011

Думаю, это единственный вариант, который у нас есть. Эвал тоже не то зло. В противном случае создайте собственную функцию для определения значений и выполнения расчетов.

0 голосов
/ 13 июля 2011

попробуй вот так.

var txt = "1/7";
var result = new Function("return " + txt)()
console.log(result); // 0.14285714285714285
0 голосов
/ 13 июля 2011

Предполагая, что вам нужно вычислить десятичные и только десятичные дроби:

txt = "1/7";

firstNumber = txt.subString(0, txt.indexOf('/'));
secondNumber = txt.subString(txt.indexOf('/') + 1, txt.length);

decml = fistNumber / secondNumber;
...