`
入云涛
  • 浏览: 155958 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java执行字符串数学表达式 ScriptEngine

    博客分类:
  • java
阅读更多
今天遇到了一个需要将数据库中保存的表达式,替换其中的字符,并计算出值,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+"%");
		}
	}

}


通过以上的方法即可实现此方法。
分享到:
评论
3 楼 tin555 2014-03-14  
有个问题 ,执行100/167.0 - 200/233.0这个表达式时会不对
因为代码没判断运算符的优先级
2 楼 xxtao110 2011-07-10  
哥们  顶啊  帮我了大忙了
1 楼 sunnylocus 2009-12-21  
文章不错先做个标记,回头再看。

相关推荐

    java 计算数学表达式

    但你可以自定义解析器,或者使用Java的`ScriptEngine`接口,如JavaScript引擎(`javax.script.ScriptEngineManager`和`javax.script.ScriptEngine`),来执行数学表达式。这种方式虽然更灵活,但可能需要更多的代码...

    Java 图形界面化实现计算数学表达式

    7. **公式求值**:你可以使用Java的`ScriptEngine`接口,尤其是`javax.script.ScriptEngineManager`和`javax.script.ScriptEngine`,来执行JavaScript引擎(Rhino或Nashorn)计算数学表达式。这样可以避免手动实现...

    Java计算数学表达式代码详解

    Java计算数学表达式的核心是将输入的字符串表达式转换为后缀表达式(逆波兰表示法),然后通过栈数据结构来计算表达式的值。这里,我们有两个关键的类:`Calculator`和`ArithHelperCalculator`,不过在提供的代码中...

    字符串转公式,输入公式的字符串形式,可以输出结果。

    表达式解析器能够理解并转换用户输入的字符串,将其转化为计算机可以理解的数学表达式。这包括识别操作符(如+,-,*,/等)、处理括号以确定运算优先级以及处理变量和常量。 2. **语法分析**:在解析过程中,首先...

    Simple-Expressions:用Java编码的GUI数学表达式计算器-Joseph Mammo

    `ScriptEngine`允许程序执行JavaScript或其他脚本语言的代码,也可以用来解析和执行简单的数学表达式。如果使用了自定义解析器,那么可能涉及到词法分析(lexer)和语法分析(parser)的概念,这是编译原理中的基础...

    数学表达式判断以及计算

    在实际开发中,可能会创建一个自定义的数学表达式解析器或使用现有的开源工具,比如Java的`ScriptEngine`接口,它可以执行JavaScript或其他脚本语言的表达式。 文件名列表中,虽然没有直接与数学表达式判断和计算...

    java把字符串转化成公式计算的示例

    对于更复杂的数学表达式或者需要更高效执行的场景,可能需要考虑其他解决方案,如使用Java的`javax.math`包,或者引入第三方库如JEP(Java Expression Parser)或JMathLib。 总的来说,Java中将字符串转化为公式...

    Java调用JavaScript实现字符串计算器代码示例

    3. 执行JavaScript代码:通过ScriptEngine实例的eval方法,传入字符串形式的JavaScript代码进行执行,并捕获可能抛出的ScriptException异常。 4. 在图形界面中使用JavaScript引擎:将ScriptEngine实例嵌入图形界面...

    利用ScriptEngineManager实现字符串公式灵活计算的方法

    首先,我们可以使用ScriptEngineManager来执行字符串的代码。下面是一个简单的示例: ```java public Double Calculation(String formula){ Double result=null; ScriptEngineManager manager = new ...

    java实现多种计算器功能包含表达式

    在Java编程语言中实现一个多功能计算器,涉及到许多关键知识点,包括但不限于基础的算术运算、字符串解析、表达式求值、异常处理以及用户界面设计。下面将详细阐述这些知识点。 1. **基础算术运算**:计算器的核心...

    表达式解析工具

    这里提到的"表达式解析工具"显然是一个用Java实现的库,用于处理各种类型的表达式,包括数字计算和字符串比较。下面将详细解释这些知识点。 1. **表达式解析**: - **表达式**:在编程中,表达式是指能够返回一个...

    这是一个用java实现的计算器 运用了swing 库 以及js的字符串计算方法

    总结,通过Java Swing,我们可以轻松创建一个具有图形界面的计算器,而JavaScript的字符串计算功能则使我们能够处理复杂的数学表达式。这种结合不仅展示了Java与JavaScript的协同工作能力,也体现了Java GUI编程的...

    java动态特性eval

    在提供的压缩包文件`eval_test`中,可能包含了测试代码或样例数据,用于验证或展示如何使用上述技术实现动态解析Java字符串。具体的代码实现和测试用例需要查看文件内容才能详细分析。 总结来说,Java中实现类似...

    JAVA设计的win10计算器

    这个类可能包含了方法如`evaluate(String expression)`,它会接收一个字符串形式的表达式,然后使用某种算法进行求值。表达式求值在计算机科学中是一个经典问题,可以采用后缀表达式(逆波兰表示法)或者递归下降...

    Editplus界面设计

    在Java中,此类可能会有一个方法接收用户输入的字符串表达式,然后通过解析这个字符串来执行相应的计算操作。计算过程中可能涉及到字符串处理、正则表达式匹配、栈或队列的数据结构来模拟运算过程,以及异常处理来...

    编译原理之之中缀到后缀

    例如,Java的`ScriptEngine`接口使用后缀表达式进行脚本计算。通过理解这种转换,开发者可以更高效地处理和解析复杂的数学表达式,提高程序的性能和可靠性。 总的来说,从编译原理的角度看,中缀到后缀的转换是一种...

    java课程设计报告计算器的设计实现分析.doc

    MultipleOperation类负责执行连续的数学运算,使用JavaScript引擎(通过ScriptEngineManager和ScriptEngine接口)来解析和执行用户输入的表达式,将结果存储在trans变量中。Listl类则用于记录历史操作,包含String...

    java课程设计-计算器的设计与实现.doc

    - **MultipleOperation**:负责处理连续运算,利用JavaScript引擎(通过ScriptEngineManager和ScriptEngine接口)来解析和执行数学表达式。 - **list**:用于存储和显示历史记录,包含运算表达式(Str)、错误信息...

    微软JavaScript手册

    exec 方法 在指定字符串中执行一个匹配查找。 exp 方法 返回 e (自然对数的底) 的幂。 FileSystemObject 对象 提供对计算机文件系统的访问。 fixed 方法 将 HTML 的&lt;TT&gt; 标识添加到String 对象中的文本两端。 ...

    java计算器

    5. **数学函数**: 使用`javax.script.ScriptEngine`和`ScriptEngineManager`来执行JavaScript表达式,因为Java的标准库没有提供直接计算三角函数和对数的方法。通过调用`Math`类的方法,可以实现sin、cos、tan、log...

Global site tag (gtag.js) - Google Analytics