从字符串运行公式
Running an equation from a string
我正在尝试创建一个简单的在线计算器,可以在JavaScript中运行基本计算。
我已经设法创建了界面,以便将数字和运算符存储在表单字段中。
我希望能够做的是将表单字段中的值传递给将计算表单字段总数的函数。
表单字段可以包含从简单的"10 + 10"
到使用括号的更复杂的公式的任何内容。使用的运算符是+
、-
、*
和/
。
是否可以将表单字段的文本(字符串)传递给可以识别运算符并对值执行操作功能的 JavaScript 函数?
文本字段中的可能值为:
120/4+130/5
然后,该函数应返回 56 作为答案。当我知道这样的值时,我已经在 JavaScript 中完成了此操作:
function WorkThisOut(a,b,c,d) {
var total = a/b+c/d;
alert (total);
}
WorkThisOut(120,4,130,5);
我希望能够做的是将"120/4+130/5"
的完整值传递给函数,它能够提取数字和运算符来创建总数。
有没有人对如何做到这一点或是否可能有任何想法? 这可能会变得更加复杂,我可能需要在括号中传递值"(120/4)+(130/5)"
我可能会因此而受到抨击。但是,无论如何它都在这里。
为此,我能想到三种解决方案:
- 实现你自己的解析器,词法分析器并解析出代码。这并不容易,但这可能是一次很棒的学习经历。
- 在仅用于此的子域下运行
eval
,以便脚本无法恶意访问您的网站 - 清理输入以仅包含
12345678790+-/*().
eval(input.replace(/[^0-9'(')'+'-'*'/'.]/g, ""));
请用技巧来绕过这个解决方案
您可以使用 math.js 库中包含的表达式解析器:
http://mathjs.org
用法示例:
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;
}
eval
呢?
将calc
视为文本字段的 ID。
$('#calc').change(function(e){
alert(eval($(this).val()));
})
但请记住在处理之前验证输入。
这是一个
相当古老的话题,但对于有类似问题的新访问者:字符串数学包计算 [字符串] 方程,如上面的示例中120/4+130/5
。它还识别括号。
相关文章:
- 如何运行在一个充满html的字符串中定义的javascript
- 一旦设置了PHP查询字符串,如何运行jQuery脚本
- 如果URL包含字符串don't运行jQuery函数
- 尝试通过输入字符串使程序停止运行
- 如何在 javascript 中的函数中将字符串作为函数运行
- 由于字符串长度问题,代码无法运行
- 当我通过 SHA1 运行字符串时的值与使用 .charCodeAt() 检查它时的值不同
- 如何让 JavaScript 一次运行一个字符串
- 运行字符串数组并在 url 中找到匹配项,如何做到这一点
- 从字符串运行公式
- 如果语句运行,则为空字符串
- 如何安全地将字符串从 Web 视图活动传递到 Android 中正在运行的服务
- 有没有办法防止字符串像多维数组一样运行
- 如何在不使用 eval() 的情况下从字符串运行 JavaScript 对象
- 在页面上不存在的标记字符串上运行 jquery 选择
- 在javascript setTimeout中将字符串作为函数运行
- 如何允许另一个索引字符串运行脚本
- JS用字符串调用函数运行时内的函数
- 在CoffeeScript中,是否存在一个'官方'在运行时而不是编译时插入字符串的方法
- 如何在运行时使用JavaScript将XUL作为字符串从Mozilla插件中获取