我需要在jquery中创建一个函数,在该函数中我有一些输入字段(数字)...以及一个最终的输入字段文本,名为Formula。
数字的输入字段可以有区别地添加,并且每个ID都应使用ID LETTERS
和_
唯一地添加到唯一标识符作为表达式变量。
在输入字段(用于数字)中,我只能插入digits
和dot
。
在公式内部,我可以创建一个文本表达式,例如:((a + b) / c) + 10
对于公式输入,我只能插入:digits . ( ) + - * /
和字母a
至z
我需要检测并从公式中提取所有变量。因此,我可以迭代所有文档以按ID搜索变量并收集每个值。
计算不是问题,我可以使用jquery expression builder plugin
。
我只需要检测公式字符串中的变量即可。
所以在一个真实的例子中:
<input type="text" id="variable_a" value="16">
<input type="text" id="varb" value="4">
<input type="text" id="c" value="2">
<input type="text" id="formula" value="(a + b) / c + 10">
<button id="btn">CALCULATE</button>
...
$(document).ready(function() {
$("#btn").on("click", function() {
var formula = $("#formula").val();
// HELP TO DETECT VARIABLES INSIDE STRING (THEY ARE ONLY LETTERS AND _ )???
...
// I NEED TO CREATE THIS ARRAY BUT HOW???
var options_formula = {
variables: [
{
name: 'a',
value: 16
},
{
name: 'b',
value: 4
},
{
name: 'c',
value: 2
}
]
};
var expBuilder = $(#formula).expressionBuilder(options_formula);
alert(expBuilder.runExpression());
});
});
有人建议从公式字符串中检测变量(字母或带有_的字母)吗?
答案 0 :(得分:1)
我建议使用mathjs parser。
要获取所有变量名,可以使用Expression trees: traverse() callback:
var scope = {};
formulaParsed.traverse(function (node, path, parent) {
if (node.type == 'SymbolNode') {
var val = +$('#variable_' + node.name).val();
scope[node.name] = isNaN(val) ? 0 : val;
}
});
现在,您的问题是如何将变量名链接到输入字段。我修改了ID。
$('#btn').on('click', function (e) {
var formula = $('#formula').val();
var formulaParsed = math.parse(formula);
var scope = {};
formulaParsed.traverse(function (node, path, parent) {
if (node.type == 'SymbolNode') {
var val = +$('#variable_' + node.name).val();
scope[node.name] = isNaN(val) ? 0 : val;
}
});
console.log(scope);
var formulaCompiled = formulaParsed.compile();
try {
var result = formulaCompiled.evaluate(scope);
$('#result').val(result);
} catch (e) {
$('#result').val(e.message);
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/6.0.3/math.min.js"></script>
<input type="text" id="variable_a" value="16">
<input type="text" id="variable_b" value="4">
<input type="text" id="variable_c" value="2">
<input type="text" id="formula" value="(a + b) / c + 10">
<input type="text" id="result" value="">
<button id="btn">CALCULATE</button>