如何计算从string到int的公式

时间:2015-04-07 07:19:17

标签: javascript jquery parsing

我有一张包含公式的表格。公式示例:

(GP1 /(GP1 + GP2))* 100%。

在使用 jquery 的代码中,我将使用textbox1值替换GP1,使用textbox2值替换GP2并删除%。

我试着通过这样做得到结果:

var repl1 = (GP1/(GP1 + GP2))*100%;
var repl2 = repl1.replace(/GP1/gi,parseInt($("#txtbox1").val()));
var repl3 = repl2.replace(/GP2/gi,parseInt($("#txtbox2").val()));
var repl4 = repl3.replace(/%/gi,"");

==>所以最后的结果将是:

 var repl4 = (10/(10+0))*100

我尝试通过这样做将其转换为int:

var result = parseInt(repl4);

但我得到的结果是 NaN

任何人都可以帮我解决如何计算公式

谢谢。

7 个答案:

答案 0 :(得分:8)

您正在寻找的是:

var result = eval(repl4)

但要小心,因为repl4中的任何Javascript都将被评估和执行,即如果有人在您的文本字段中键入恶意Javascript,它将被执行,除非您对其进行过滤。

parseInt()应用于文本输入的值但是在示例中使用eval()是可接受的,因为它将返回一个整数或NaN,从而阻止任何代码注入(这假设当然,公式也不是来自input

答案 1 :(得分:3)

$("#btnCal").click(function(){
var repl1 = "(GP1/(GP1 + GP2))*100%";
var repl2 = repl1.replace(/GP1/gi,parseInt($("#txt1").val()));
var repl3 = repl2.replace(/GP2/gi,parseInt($("#txt2").val()));
var repl4 = repl3.replace(/%/gi,"");
  alert(eval(repl4));
  });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input type="text" id="txt1">
<input type="text" id="txt2">



<input type="button" id="btnCal" value="calculate">

答案 2 :(得分:2)

在替换值后使用eval

var result = eval(repl4);

并将您的表达式放在引号中,否则它将显示错误,如未声明或找到的GP变量

var repl1 = "(GP1/(GP1 + GP2))*100%";

<强> JSFiddle Demo

答案 3 :(得分:2)

最好的解决方案是使用专用解析器来解析并稍后评估表达式。依赖 eval 是一种非常容易的XSS攻击攻击媒介。

有几个数学库,下面的例子使用math.js。根据您的实际使用情况,它可能是一种矫枉过正,简单的单功能手工解析器就足够了。

注意我仍然需要包含一点hack,因为math.js无法应对百分号。当然,更好的方法是在math.js中实际包含该功能。

&#13;
&#13;
var calculate = document.getElementById("calculate"),
  formula = document.getElementById("formula"),
  gp1 = document.getElementById("gp1"),
  gp2 = document.getElementById("gp2"),
  result = document.getElementById("result");


calculate.addEventListener("click", function() {
  var expr = formula.value.replace(/%/, "*(1/100)");
  result.value = math.eval(expr, {
    GP1: parseInt(gp1.value, 10),
    GP2: parseInt(gp2.value, 10)
  });
});
&#13;
GP1:
<input type="number" id="gp1" value="123" />
<br>GP2:
<input type="number" id="gp2" value="456" />Formula:
<input type="text" id="formula" value="(GP1/(GP1 + GP2))*100%" />
<hr>
<button id="calculate">Calculate!</button>
<br>Result:
<output>
  <input type="number" readonly="readonly" id="result" />
</output>

<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/1.5.0/math.min.js"></script>
&#13;
&#13;
&#13;

答案 4 :(得分:1)

您可以使用var result = eval(repl4)。这将评估公式并将其存储到result

答案 5 :(得分:1)

运行parseInt((10/(10+0))*100);将为您提供所需的答案,因为它是一个数字,但parseInt无法将字符串'(10 /(10 + 0))* 100'转换为数字(很可能是因为非数字字符。

你可以(如果你需要)使用eval来解决它,即

parseInt(eval('(10/(10+0))*100'));

答案 6 :(得分:1)

以下是快速jsFiddle,我还在parseInt方法中添加了missing radix parameter以确保完整性。

$(document).on('click', 'button', function () {

var repl1 = '(GP1/(GP1 + GP2)) * 100%';

var repl2 = repl1.replace(/GP1/gi, parseInt($('#txtbox1').val(), 10));
var repl3 = repl2.replace(/GP2/gi, parseInt($('#txtbox2').val(), 10));
var repl4 = repl3.replace(/%/gi, "");

$('#result').html(repl4);

});