注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

游戏记忆...

竹石 Blog

 
 
 

日志

 
 

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

2010-12-26 21:41:16|  分类: java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://ruyuntao.javaeye.com/blog/406935

今天遇到了一个需要将数据库中保存的表达式,替换其中的字符,并计算出值,java是不能直接计算的例如:
Java代码
  1. double d = (3+5-(2-4)*2)/24;没有问题  
  2.   
  3. 但是:遇到   "(3+5-(2-4)*2)/24" 字符串的格式,就不能使用了  
double d = (3+5-(2-4)*2)/24;没有问题

但是:遇到   "(3+5-(2-4)*2)/24" 字符串的格式,就不能使用了


java是无法解决,但是javaScript中有一个eval函数是可以执行的,所以,可以通过其他途径执行javaScript就可以做到,而ScriptEngine是java的一个javaScript实现类,所以就找到了方法,详细方法见下
Java代码
  1. public class MapJ {  
  2.     private String key;//替换的编号  
  3.     private String value;//值  
  4.     public String getKey() {  
  5.         return key;  
  6.     }  
  7.     public void setKey(String key) {  
  8.         this.key = key;  
  9.     }  
  10.     public String getValue() {  
  11.         return value;  
  12.     }  
  13.     public void setValue(String value) {  
  14.         this.value = value;  
  15.     }  
  16.     public MapJ(String key, String value) {  
  17.         super();  
  18.         this.key = key;  
  19.         this.value = value;  
  20.     }  
  21.     public MapJ() {  
  22.         super();  
  23.     }  
  24.       
  25. }  
  26.   
  27.   
  28. //实现类  
  29. import java.util.List;  
  30.   
  31. import javax.script.ScriptEngine;  
  32. import javax.script.ScriptEngineManager;  
  33. import javax.script.ScriptException;  
  34.   
  35. public class JavaScript {  
  36.     ScriptEngineManager factory = new ScriptEngineManager();  
  37.     ScriptEngine engine = factory.getEngineByName("JavaScript");  
  38.       
  39.     public Double getMathValue(List<MapJ> map,String option){  
  40.         double d = 0;  
  41.         try {  
  42.             for(int i=0; i<map.size();i++){  
  43.                 MapJ mapj = map.get(i);  
  44.                 option = option.replaceAll(mapj.getKey(), mapj.getValue());  
  45.             }  
  46.             Object o = engine.eval(option);  
  47.             d = Double.parseDouble(o.toString());  
  48.         } catch (ScriptException e) {  
  49.             System.out.println("无法识别表达式");  
  50.             return null;  
  51.         }  
  52.         return d;  
  53.     }  
  54. }  
  55.   
  56.   
  57. //测试  
  58. import java.util.ArrayList;  
  59. import java.util.List;  
  60.   
  61. public class JavaScriptTest {  
  62.   
  63.     /** 
  64.      * @param args 
  65.      */  
  66.     public static void main(String[] args) {  
  67.           
  68.   
  69.         String sbt = "(B+D-(A-C)*A)/F";  
  70.         List<MapJ> all = new ArrayList<MapJ>();  
  71.         all.add(new MapJ("A","2"));  
  72.         all.add(new MapJ("B","3"));  
  73.         all.add(new MapJ("C","4"));  
  74.         all.add(new MapJ("D","5"));  
  75.         all.add(new MapJ("F","24"));  
  76.         JavaScript js = new JavaScript();  
  77.         Double d = js.getMathValue(all, sbt);  
  78.         if(d==null){  
  79.             System.out.println("                 无法计算这个表达式");  
  80.         }else{  
  81.             System.out.println(d*100+"%");  
  82.         }  
  83.     }  
  84.   

  评论这张
 
阅读(916)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018