String类型数学表达式直接进行运算

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

通过以上的方法即可实现此方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值