我有一些简单的变量,其值是数字字符串:
var s = '10*10*10',
v = '60*10';
我想将s
变为1000
,将v
变为600
。
答案 0 :(得分:7)
使用eval()
功能:
var result = eval('10*10*10');
alert(result); // alerts 1000
答案 1 :(得分:7)
如果 字符串来自真正受信任的来源,您可以使用eval
来执行此操作:
var s = '10*10*10';
var result = eval(s);
但是请注意eval
会启动JavaScript解析器,解析给定的字符串并执行它。如果给定字符串可能不是来自可靠来源,您不希望使用它,因为您可以让源能够任意执行代码。
如果您不能信任源,那么您必须自己解析字符串。您的具体示例很简单,但我确信您的实际需求更加复杂。
死的简单:
var s, operands, result, index;
s = '10*10*10';
operands = s.split('*');
result = parseInt(operands[0], 10);
for (index = 1; index < operands.length; ++index) {
result *= parseInt(operands[index], 10);
}
...但是,我确定你的实际要求更复杂 - 其他运算符,值周围的空格,括号等。
在下面提到Andy E的评论,白名单可能是一种可行的方式:
function doTheMath(s) {
if (!/^[0-9.+\-*\/%() ]+$/.test(s)) {
throw "Invalid input";
}
return eval('(' + s + ')');
}
var result = doTheMath('10*10*10'); // 1000
var result2 = doTheMath('myEvilFunctionCall();'); // Throws exception
那个正则表达可能并不完美,在我让任何未经洗涤的输入结束之前,我会长时间地盯着它......
答案 2 :(得分:1)
这可以很简单地实现而不需要使用eval
function calc(s) {
s = s.replace(/(\d+)([*/])(\d+)/g, function() {
switch(arguments[2]) {
case '*': return arguments[1] * arguments[3];
case '/': return arguments[1] / arguments[3];
}
})
s = s.replace(/(\d+)([+-])(\d+)/g, function() {
switch(arguments[2]) {
case '+': return parseInt(arguments[1]) + parseInt(arguments[3]);
case '-': return arguments[1] - arguments[3];
}
})
return parseInt(s);
}
alert(calc("10+5*4"))
答案 3 :(得分:0)
您可以使用eval
函数来评估字符串中的表达式:
var evaluated = eval(s);
alert(evaluated)
会提醒1000
。
答案 4 :(得分:0)
如果您“只是”希望将这些数字从字符串中删除,那么
eval(s)
将“10 * 10 * 10”作为数字