Javascript 使用输入的公式计算值
这是我的html代码:Javascript 使用输入的公式计算值,javascript,php,jquery,Javascript,Php,Jquery,这是我的html代码: <input id="R1" type="text" value="100"> <input id="R2" type="text" value="200"> <input id="formula" type="text" value=""> <input type="button" id="save" value="save"> 在这里,用户动态输入公式值,如R1+R2、R1-R2*100。我需要用这个公式来计算最终的值
<input id="R1" type="text" value="100">
<input id="R2" type="text" value="200">
<input id="formula" type="text" value="">
<input type="button" id="save" value="save">
在这里,用户动态输入公式值,如R1+R2、R1-R2*100。我需要用这个公式来计算最终的值
例如:如果用户在公式字段R1+R2中输入值;我需要结果300。
如何动态计算该值?您可以使用eval。这是最快、最简单的解决方案,但您必须小心使用,并使用regexp检查公式中只有R1、R2和数学运算符
或者更好的解决方案,例如,您可以找到一个库来解析表达式
由于+出现问题,您必须使用+val1++val2中缀到前缀转换算法: 前缀计算算法:
使用这些链接中的帮助。查看此代码段,可以使用任何组合: 函数calExpression{ var f=document.getElementById'formula'; var inps=document.getElementsByTagName'input'; var expression=f.value.toUpperCase;/'+f.value.replace/[-\/\+\\]/g,'$1'+''; 对于变量i=0;i
function calculate(){
var valid = true;
var regex = /(?:[a-z$_][a-z0-9$_]*)|(?:[;={}\[\]"'!&<>^\\?:])/ig;
var formula = document.querySelector('#formula').value;
var R1 = parseInt(document.querySelector('#R1').value);
var R2 = parseInt(document.querySelector('#R2').value);
formula = formula.replace(/R1/g, R1).replace(/R2/g,R2);
formula = formula.replace(regex, function (elm) {
return Math.hasOwnProperty(elm)
? "Math."+elm
: valid = false;
});
if (valid)
alert(eval(formula));
}
这是我很久以前做过的事情。尝试使用堆栈将当前中缀字符串解析为前缀字符串,然后使用前缀求值进行求值。搜索“expression evaluator”库,例如,由于此答案使用了eval,所以先对其进行了向下投票,但是,将表达式转换为大写实际上是一个简单而聪明的想法,可以防止执行其他javascript代码。谢谢。我很沮丧,因为我一直保持活力,但还是被否决了;否决此答案,因为您无法以R1+R2-R1*3+1/2的形式运行实数算术表达式,例如..:/@PaulBoutes我作为RegExp添加了一个好的捕获,实际上它只得到一个。谢谢,你得到了和我一样的结果。因此,我取消了否决票:
function calculate(){
var valid = true;
var regex = /(?:[a-z$_][a-z0-9$_]*)|(?:[;={}\[\]"'!&<>^\\?:])/ig;
var formula = document.querySelector('#formula').value;
var R1 = parseInt(document.querySelector('#R1').value);
var R2 = parseInt(document.querySelector('#R2').value);
formula = formula.replace(/R1/g, R1).replace(/R2/g,R2);
formula = formula.replace(regex, function (elm) {
return Math.hasOwnProperty(elm)
? "Math."+elm
: valid = false;
});
if (valid)
alert(eval(formula));
}
<input id="R1" type="text" value="100">
<input id="R2" type="text" value="200">
<input id="formula" type="text" value="">
<input type="button" id="save" value="save" onclick="calculate()">