使用文本字段中的Javascript运行等式
我正在尝试创建一个简单的在线计算器,可以在Javascript中运行基本计算。
我已设法创建接口,以便数字和运算符存储在表单字段中。
我希望能够做的是将表单字段中的值传递给一个函数,该函数将计算表单字段的总和。
表单字段可以包含使用括号从简单的10 + 10到更复杂的等式的任何内容。 使用的运营商是+ – * /
是否可以将表单字段传递给javascript函数,该函数可以识别运算符并对值执行操作的function。
文本字段中的可能值为:
四分之一百二十+五分之一百三十
然后该函数应返回56作为答案。 当我知道这个小提琴中的值时,我已经在javascript中完成了这个.http: //jsfiddle.net/DhqGB/
我想要做的是将完整的值“120/4 + 130/5”传递给函数,它能够提取数字和运算符来创建总数。
有没有人对如何做到这一点或是否有可能有任何想法? 这可能会变得更加复杂,我可能需要在括号中传递值“(120/4)+(130/5)”
eval
怎么样?
将calc
视为textfield的id。 然后
$('#calc').change(function(e){ alert(eval($(this).val())); })
但请记住在处理之前validation输入。
我可能因此受到抨击。 但是,无论如何它仍然存在。
我能想到三种解决方案:
- 实现自己的解析器,词法分析器并解析代码。 这不是一件容易的事,但它可能是一次很棒的学习经历。
- 在仅为此目的的子域下运行
eval
,以便脚本不会恶意访问您的站点 - 清理输入以仅包含
12345678790+-/*().
eval(input.replace(/[^0-9\(\)\+\-\*\/\.]/g, ""));
请用技巧来解决这个问题
您可以使用math.js库中包含的表达式解析器:
用法示例:
math.eval('1.2 / (2.3 + 0.7)'); // 0.4 math.eval('5.08 cm in inch'); // 2 inch math.eval('sin(45 deg) ^ 2'); // 0.5 math.eval('9 / 3 + 2i'); // 3 + 2i math.eval('det([-1, 2; 3, 1])'); // -7
如果您不允许使用标识符,则很难对eval造成太大损害。
function reval(string){ var answer=''; if(/^[\d()\/*.+-]+$/.test(str)){ try{ answer= eval(str); } catch(er){ answer= er.name+', '+er.message; } } return answer; }
这是一个相当古老的主题,但对于有类似问题的新访问者: string-math包计算[String]方程式,如上面的示例120/4+130/5
。 它还识别括号。