我有一张包含公式的表格。公式示例:
(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 。
任何人都可以帮我解决如何计算公式
谢谢。
答案 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中实际包含该功能。
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;
答案 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);
});