`
入云涛
  • 浏览: 153811 次
  • 性别: 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使用ScriptEngine说明

    Java使用ScriptEngine说明

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

    今天小编就为大家分享一篇利用ScriptEngineManager实现字符串公式灵活计算的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)

    主要介绍了JavaScript字符串对象replace方法实例,replace方法用于字符串替换,同时支持正则表达式替换,需要的朋友可以参考下

    VBSCRIPT中文手册

    Execute 方法 根据指定的字符串,执行正则表达式的搜索。 Execute 语句 执行单个或更多的指定语句。 Exit 语句 退出 Do...Loop、For...Next、 Function 或 Sub 代码块。 Exp 函数 返回 e (自然对数的底)的多少...

    vb Script参考文档

    Execute 方法 根据指定的字符串,执行正则表达式的搜索。 Execute 语句 执行单个或更多的指定语句。 Exit 语句 退出 Do...Loop、For...Next、 Function 或 Sub 代码块。 Exp 函数 返回 e (自然对数的底)的多少...

    VBScript 语言参考

    Execute 方法 根据指定的字符串,执行正则表达式的搜索。 Execute 语句 执行单个或更多的指定语句。 ExecuteGlobal 语句 执行一个或多个在全局脚本名字空间中所指定的语句。 Exit 语句 退出 Do...Loop、For......

    VBScript 语言参考中文手册CHM

    Execute 方法 根据指定的字符串,执行正则表达式的搜索。 Execute 语句 执行单个或更多的指定语句。 ExecuteGlobal 语句 执行一个或多个在全局脚本名字空间中所指定的语句。 Exit 语句 退出 Do...Loop、For......

    VBSCRIP5 -ASP用法详解

    Execute 方法 根据指定的字符串,执行正则表达式的搜索。 Execute 语句 执行单个或更多的指定语句。 ExecuteGlobal 语句 执行一个或多个在全局脚本名字空间中所指定的语句。 Exit 语句 退出 Do...Loop、For......

    基于Dagger+Java ScriptEngine+Java Selenium的自动化测试框架.zip

    基于Dagger+Java ScriptEngine+Java Selenium的自动化测试框架

    封装好的Java调用JavaScript引擎工具

    其实使用javascript动态调试测试功能,是一个很好的方式,

    javascript文档

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

    微软JavaScript手册

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

    JScript 语言参考

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

    ScriptEngine that running java code; Real JavaScript.zip

    ScriptEngine that running java code; Real JavaScript.zip

    Windows ScriptEngine

    windows 不能执行脚本时,运行一下这个文件就可以了。(FOR WINDOWS XP 中文版)

    使用java调用js

    该class文件讲述了利用ScriptEngine来实现用java调用js的方法,由于js的动态性,在某些方面特别用于,例如,输入字符串优先级运算问题,使用该方法特别方便

    Javascript中eval函数的使用方法与示例

    要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句。 返回值 通过计算 string 得到的值(如果有的话)。 说明 该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作...

    计算器.jar

    总体思想是,创建图形面板,为组件添加监听,将运算符前面的数添加到StringBuilder类实例中,利用javaScriptEngine直接对字符串公式运算求值。已知问题:浮点数运算精度问题,例如0.1+0.2不等于0.3,运算符可以按出...

    可在Java ScriptEngineManager执行的security.js

    使用详情见 博客 利用ScriptEngineManager执行js的RSA加密 http://blog.csdn.net/userwyh/article/details/52345718

    Java计算器实验报告(1).doc

    计算方面,调用ScriptEngineManager和ScriptEngine两 个类,直接通过eval函数直接把输入文本当作JS代码执行,输出执行结果,这样报错也 会直接实现,另把文本框设置不允许直接从键盘输入以防止出现安全事件。...

Global site tag (gtag.js) - Google Analytics