如何在MS SQL Server数据库中存储数学公式并使用JAVA进行解释?

如何在MS SQL Server数据库中存储数学公式并使用JAVA进行解释?,java,database,string,parsing,Java,Database,String,Parsing,我必须给用户一个选项,在文本字段中输入一个数学公式,然后将其作为字符串保存在数据库中。这很容易,但我还需要检索它并使用它进行计算 例如,假设我允许某人指定我必须以字符串格式保存在DB中的员工工资计算公式 GROSS_PAY = BASIC_SALARY - NO_PAY + TOTAL_OT + ALLOWANCE_TOTAL 假设我们知道诸如毛工资、基本工资等条款,我们可以了解它们的评估结果。真正的问题是,我们无法预测用户可能选择输入这些术语(如GROSS_PAY等)和其他数学运算符的组合

我必须给用户一个选项,在文本字段中输入一个数学公式,然后将其作为字符串保存在数据库中。这很容易,但我还需要检索它并使用它进行计算

例如,假设我允许某人指定我必须以字符串格式保存在DB中的员工工资计算公式

GROSS_PAY = BASIC_SALARY - NO_PAY + TOTAL_OT +  ALLOWANCE_TOTAL
假设我们知道诸如毛工资、基本工资等条款,我们可以了解它们的评估结果。真正的问题是,我们无法预测用户可能选择输入这些术语(如GROSS_PAY等)和其他数学运算符的组合(不仅是+、-、×、/而且还有表示根和幂等的部首叹息)。那么,一旦我们从数据库中检索到这个公式,我们如何以字符串格式解释它,这样我们就可以根据公式的组成进行计算了

到目前为止,Java中有一个JavaScript引擎,可以使用运算符执行字符串功能


希望这有帮助。

构建表达式计算器实际上相当简单

看。对于您想要的表达式运算符和操作数范围,有了BNF,您可以按照此过程直接在Java中为这些表达式构建解析器

答案链接到第二个答案,该答案讨论如何在解析表达式时对其求值


因此,从数据库中读取字符串,收集表达式中可能出现的一组变量,然后解析/计算字符串。如果您事先不知道变量(似乎您必须知道),您可以对表达式进行两次解析,第一次只是为了获得变量名。

您可以构建一个类的字符串表示形式,该类可以有效地包装您的表达式,并使用系统对其进行编译—它需要一个文件系统。您可以直接使用javaScript或。在每种情况下,您都需要找到绑定变量的方法。一种方法是使用对绑定函数的调用来查找和替换已知变量名:

getValue("BASIC_SALARY") - getValue("NO_PAY") + getValue("TOTAL_OT") +  getValue("ALLOWANCE_TOTAL")

然而,这种方法使您暴露于各种注入类型的安全漏洞中;因此,如果需要安全保障,那就不合适了。在错误诊断方面,这种方法也很弱。你将如何告诉用户为什么他们的表达被破坏


另一种方法是使用类似的方法在java中生成解析器。这并不难,有很多例子。这种方法将同时提供安全性(用户不能注入恶意代码,因为它不会解析)和诊断功能。

@a_horse_with_no_name我尝试过这样做,但没有成功。ThnX您可以尝试使用正则表达式(或其他方法(编写一个解析方法,在其中拆分一个运算符,然后将其全部挑选出来)来挑选所有运算符,并对其执行所需操作。因为不可能“将字符串转换为运算符”.你知道如何实现这个吗?不,事实上,我没有实现这个。但是感谢所有回答的人。我现在也选择了一个答案,我认为这解释了最好的解决方法/如果我必须实现这个,我会怎么做。再次感谢。你几乎不需要去这样的间接方式来获得一个表达式evaluator。你可以直接在Java中进行这样的表达式求值。嘿,Ira,当然在Java中也可以。作为Markus,我会考虑正则表达式。你的建议是什么?你的建议是什么?在解析时,正则表达式总是错误的答案;它不能处理嵌套的括号。请参阅我刚才提供的答案。
getBASIC_SALARY() - getNO_PAY() + getTOTAL_OT() + getALLOWANCE_TOTAL()