2011-06-15 41 views
1

我有一些简单的变量,其值是数字字符串:字符串转换为数字

var s = '10*10*10', 
    v = '60*10'; 

我想转成s1000v600

+0

只适用于乘法运算符? – patapizza 2011-06-15 09:48:03

+4

这些值来自哪里? – 2011-06-15 09:48:14

+0

@tomalak它来自yaml,它是一个配置文件。 – 2011-06-15 09:55:58

回答

7

使用eval()功能:

var result = eval('10*10*10'); 
alert(result); // alerts 1000 
+1

是的,但我无法对此答案赞不绝口,因为您没有通过关于何时这将是一个令人难以置信的糟糕主意的任何警告。 – 2011-06-15 10:02:09

0

可以使用eval函数的字符串表达式求值:

var evaluated = eval(s);

alert(evaluated)也就那么警报1000

0

如果你 “只是” 想有这些号码的开出的字符串,你可以做

eval(s) 

得到 “10 * 10 * 10” 的号码

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); 
} 

...但同样,我相信你的实际需求更加复杂  —其他运营商,各地值,括号空格等


下面安迪·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 

Live example

这正则表达式可能不是完美的,我会在它漫长而艰难的盯着面前我会让任何洗过头输入的道路......

+2

+1;使用正则表达式可能最容易将输入中的数字和数学运算符列入白名单。 – 2011-06-15 09:57:33

+0

@安迪E:是的,如果你半信任源代码,这可能是一条路。 :-) – 2011-06-15 09:59:05

+1

+1很好的答案。在适当的时候使用'eval',警告什么时候没有,以及另一种方式(我正在考虑发布,但是cba想出什么努力!) – 2011-06-15 10:01:49

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"))