Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用输入的公式计算值_Javascript_Php_Jquery - Fatal编程技术网

Javascript 使用输入的公式计算值

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。我需要用这个公式来计算最终的值

这是我的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。我需要用这个公式来计算最终的值

例如:如果用户在公式字段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 然后,你必须解析你的公式。有了这段代码,您将能够添加像R1+R2-R1*3+1这样的表达式

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