Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.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 如何计算从字符串到int的公式_Javascript_Jquery_Parsing - Fatal编程技术网

Javascript 如何计算从字符串到int的公式

Javascript 如何计算从字符串到int的公式,javascript,jquery,parsing,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,parse

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

(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 result = parseInt(repl4);
==>所以最后的结果是:

 var repl4 = (10/(10+0))*100
我尝试通过以下操作将其转换为int:

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 result = parseInt(repl4);
但是我得到了结果

有人能帮我计算这个公式吗


谢谢。

您需要的是:

var result = eval(repl4)
但是要小心,因为repl4中的任何Javascript都将被评估和执行,也就是说,如果有人在您的文本字段中键入恶意Javascript,除非您对其进行过滤,否则它将被执行


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

您可以使用
var result=eval(repl4)
。这将评估公式并将其存储到
结果
运行
parseInt((10/(10+0))*100)
会给出您想要的答案,因为它是一个数字,但是
parseInt
无法将字符串“(10/(10+0))*100”转换为数字(很可能是因为非数字字符)

您可以(如果需要)使用
eval
绕过它,即


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

在替换值后使用eval

var result = eval(repl4);
并将表达式放在引号中,否则它将显示错误,如未声明或未找到GP变量

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

$(“#btnCal”)。单击(函数(){
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,“”);
警报(评估(回复4));
});

这里是一个快速的例子,为了完整性,我还添加了
parseInt
方法

$(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);

});

最佳的解决方案是使用专用的解析器解析和稍后的表达式。依赖于EVE是一个非常容易的攻击向量。 这里有几个数学库,下面的例子利用了它们。根据您的实际使用情况,它可能有些过分,一个简单的单功能手工解析器就足够了

注意由于math.js无法处理百分号,因此我仍然需要添加一些hack。当然,更好的方法是在math.js中实际添加该功能。
var calculate=document.getElementById(“计算”),
公式=document.getElementById(“公式”),
gp1=document.getElementById(“gp1”),
gp2=document.getElementById(“gp2”),
结果=document.getElementById(“结果”);
calculate.addEventListener(“单击”,函数(){
var expr=公式.值.替换(/%/,“*(1/100)”);
result.value=math.eval(expr{
GP1:parseInt(GP1.value,10),
GP2:parseInt(GP2.value,10)
});
});
GP1:

GP2: 公式:
算算!
结果:
首先打印repl4以检查返回的内容。是否出现任何字符串或特殊字符。repl4的结果是:(10/(10+0))*100.我希望最终结果为1。是否仍有计算方法?我猜在您的示例中,第一行上方的代码应该是字符串,但缺少引号。听起来您正在实现一个动态计算引擎。我有理由实现Dijkstra调车场解析器,用于任意(用户输入!)几年前JS中的公式,用于类似的需求。使用白名单限制允许的函数,不要使用eval…实际上,我认为根据此应用程序的使用情况使用eval是可以的。请记住,有人总是可以键入
警报(“Hacked!”)
(甚至更糟)如果有某种保存机制,其他人可以查看其他用户在文本框中放置的内容(随机javascript将在其他人的机器上运行),我不建议使用
eval
。从不,从不,
eval()
文本字段,这正是此处所述的原因。@ltode如果在将输入传递给
eval
之前验证输入,则不会发生任何不好的情况。例如,将其包装在一个简单的健全性检查中,如
if(/^[-+*\/\d\s.()]+$/.test(repl4))
,并且可能发生的最坏情况是异常。从我的角度来看,
parseInt()
应该可以做到这一点。这有点取决于公式的来源,但输入是包含在内的。建议使用专门构建的库!