今天遇到了一个需要将数据库中保存的表达式,替换其中的字符,并计算出值,java是不能直接计算的例如:
double d = (3+5-(2-4)*2)/24;没有问题
但是:遇到 "(3+5-(2-4)*2)/24" 字符串的格式,就不能使用了
java是无法解决,但是javaScript中有一个eval函数是可以执行的,所以,可以通过其他途径执行javaScript就可以做到,而ScriptEngine是java的一个javaScript实现类,所以就找到了方法,详细方法见下
public class MapJ {
private String key;//替换的编号
private String value;//值
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public MapJ(String key, String value) {
super();
this.key = key;
this.value = value;
}
public MapJ() {
super();
}
}
//实现类
import java.util.List;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class JavaScript {
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
public Double getMathValue(List<MapJ> map,String option){
double d = 0;
try {
for(int i=0; i<map.size();i++){
MapJ mapj = map.get(i);
option = option.replaceAll(mapj.getKey(), mapj.getValue());
}
Object o = engine.eval(option);
d = Double.parseDouble(o.toString());
} catch (ScriptException e) {
System.out.println("无法识别表达式");
return null;
}
return d;
}
}
//测试
import java.util.ArrayList;
import java.util.List;
public class JavaScriptTest {
/**
* @param args
*/
public static void main(String[] args) {
String sbt = "(B+D-(A-C)*A)/F";
List<MapJ> all = new ArrayList<MapJ>();
all.add(new MapJ("A","2"));
all.add(new MapJ("B","3"));
all.add(new MapJ("C","4"));
all.add(new MapJ("D","5"));
all.add(new MapJ("F","24"));
JavaScript js = new JavaScript();
Double d = js.getMathValue(all, sbt);
if(d==null){
System.out.println(" 无法计算这个表达式");
}else{
System.out.println(d*100+"%");
}
}
}
通过以上的方法即可实现此方法。
分享到:
相关推荐
但你可以自定义解析器,或者使用Java的`ScriptEngine`接口,如JavaScript引擎(`javax.script.ScriptEngineManager`和`javax.script.ScriptEngine`),来执行数学表达式。这种方式虽然更灵活,但可能需要更多的代码...
7. **公式求值**:你可以使用Java的`ScriptEngine`接口,尤其是`javax.script.ScriptEngineManager`和`javax.script.ScriptEngine`,来执行JavaScript引擎(Rhino或Nashorn)计算数学表达式。这样可以避免手动实现...
Java计算数学表达式的核心是将输入的字符串表达式转换为后缀表达式(逆波兰表示法),然后通过栈数据结构来计算表达式的值。这里,我们有两个关键的类:`Calculator`和`ArithHelperCalculator`,不过在提供的代码中...
表达式解析器能够理解并转换用户输入的字符串,将其转化为计算机可以理解的数学表达式。这包括识别操作符(如+,-,*,/等)、处理括号以确定运算优先级以及处理变量和常量。 2. **语法分析**:在解析过程中,首先...
`ScriptEngine`允许程序执行JavaScript或其他脚本语言的代码,也可以用来解析和执行简单的数学表达式。如果使用了自定义解析器,那么可能涉及到词法分析(lexer)和语法分析(parser)的概念,这是编译原理中的基础...
在实际开发中,可能会创建一个自定义的数学表达式解析器或使用现有的开源工具,比如Java的`ScriptEngine`接口,它可以执行JavaScript或其他脚本语言的表达式。 文件名列表中,虽然没有直接与数学表达式判断和计算...
对于更复杂的数学表达式或者需要更高效执行的场景,可能需要考虑其他解决方案,如使用Java的`javax.math`包,或者引入第三方库如JEP(Java Expression Parser)或JMathLib。 总的来说,Java中将字符串转化为公式...
3. 执行JavaScript代码:通过ScriptEngine实例的eval方法,传入字符串形式的JavaScript代码进行执行,并捕获可能抛出的ScriptException异常。 4. 在图形界面中使用JavaScript引擎:将ScriptEngine实例嵌入图形界面...
在Java编程语言中实现一个多功能计算器,涉及到许多关键知识点,包括但不限于基础的算术运算、字符串解析、表达式求值、异常处理以及用户界面设计。下面将详细阐述这些知识点。 1. **基础算术运算**:计算器的核心...
首先,我们可以使用ScriptEngineManager来执行字符串的代码。下面是一个简单的示例: ```java public Double Calculation(String formula){ Double result=null; ScriptEngineManager manager = new ...
这里提到的"表达式解析工具"显然是一个用Java实现的库,用于处理各种类型的表达式,包括数字计算和字符串比较。下面将详细解释这些知识点。 1. **表达式解析**: - **表达式**:在编程中,表达式是指能够返回一个...
总结,通过Java Swing,我们可以轻松创建一个具有图形界面的计算器,而JavaScript的字符串计算功能则使我们能够处理复杂的数学表达式。这种结合不仅展示了Java与JavaScript的协同工作能力,也体现了Java GUI编程的...
在提供的压缩包文件`eval_test`中,可能包含了测试代码或样例数据,用于验证或展示如何使用上述技术实现动态解析Java字符串。具体的代码实现和测试用例需要查看文件内容才能详细分析。 总结来说,Java中实现类似...
这个类可能包含了方法如`evaluate(String expression)`,它会接收一个字符串形式的表达式,然后使用某种算法进行求值。表达式求值在计算机科学中是一个经典问题,可以采用后缀表达式(逆波兰表示法)或者递归下降...
在Java中,此类可能会有一个方法接收用户输入的字符串表达式,然后通过解析这个字符串来执行相应的计算操作。计算过程中可能涉及到字符串处理、正则表达式匹配、栈或队列的数据结构来模拟运算过程,以及异常处理来...
例如,Java的`ScriptEngine`接口使用后缀表达式进行脚本计算。通过理解这种转换,开发者可以更高效地处理和解析复杂的数学表达式,提高程序的性能和可靠性。 总的来说,从编译原理的角度看,中缀到后缀的转换是一种...
MultipleOperation类负责执行连续的数学运算,使用JavaScript引擎(通过ScriptEngineManager和ScriptEngine接口)来解析和执行用户输入的表达式,将结果存储在trans变量中。Listl类则用于记录历史操作,包含String...
- **MultipleOperation**:负责处理连续运算,利用JavaScript引擎(通过ScriptEngineManager和ScriptEngine接口)来解析和执行数学表达式。 - **list**:用于存储和显示历史记录,包含运算表达式(Str)、错误信息...
exec 方法 在指定字符串中执行一个匹配查找。 exp 方法 返回 e (自然对数的底) 的幂。 FileSystemObject 对象 提供对计算机文件系统的访问。 fixed 方法 将 HTML 的<TT> 标识添加到String 对象中的文本两端。 ...
5. **数学函数**: 使用`javax.script.ScriptEngine`和`ScriptEngineManager`来执行JavaScript表达式,因为Java的标准库没有提供直接计算三角函数和对数的方法。通过调用`Math`类的方法,可以实现sin、cos、tan、log...