如何避免字符串到十进制转换的eval

时间:2011-07-13 10:14:49

标签: javascript eval

我有“1/7”并希望获得十进制等值。当然我可以使用eval(“1/7”),但考虑到eval是邪恶的,还有其他方法吗?

5 个答案:

答案 0 :(得分:6)

eval并不邪恶。在不检查输入的情况下,在任意字符串上使用它是唯一的恶意。

答案 1 :(得分:3)

你可以编写自己的函数,它并不是非常复杂和高效:

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/

编辑:如果您在使用此类实体后,我会使用“class”作为示例:

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

答案 2 :(得分:1)

我猜这是我们唯一的选择。 Eval也不是那么邪恶。否则,创建自己的函数来识别值并进行计算。

答案 3 :(得分:0)

假设你必须计算小数而只计算小数:

txt = "1/7";

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

decml = fistNumber / secondNumber;

答案 4 :(得分:0)

尝试这样。

var txt = "1/7";
var result = new Function("return " + txt)()
console.log(result); // 0.14285714285714285