文档章节

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

反经
 反经
发布于 2014/04/12 14:42
字数 365
阅读 254
收藏 0
今天遇到了一个需要将数据库中保存的表达式,替换其中的字符,并计算出值,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. }  

本文转载自:http://ruyuntao.iteye.com/blog/406935

反经
粉丝 36
博文 172
码字总数 43569
作品 0
广州
程序员
私信 提问
在服务器端运行JavaScript文件(一)

简介: 把JavaScript脚本与服务器上Java代码相结合,从而获得在服务器端和客户端都能够自由使用的JavaScript脚本。另外,经过这一系列的被展现技术,无论是基于Ajax还是非Ajax的客户端,都将...

长平狐
2012/10/16
1K
0
Java 8 Nashorn 引擎

Java 8 Nashorn 脚本引擎 java8 终于来了.函数式接口,lambda表达式期待很久了.新的武器在手,应该可以玩出新花样. 前两天无意中发现java8 中还带了另外一个有意思的东西. Nashorn 一个javascr...

架构梦想
2014/03/25
8.3K
33
Java_脚本引擎_01_用法入门

一、前言 最近有个需求,需要在js中调用java,这样能避免更新java,从而实现代码的热更新。 于是想到用 Nashorn JavaScript 引擎。 二、概述 通过 JDK 8 的 Nashorn JavaScript 引擎 ,可以很...

shirayner
2018/08/01
0
0
快学Scala初级A1整理(1)

Scala是一门有趣且实用的语言,它以JVM位目标环境,将面向对象和函数式编程有机地结合起来,带来独特的编程体验。本文主要整理《快学Scala》中的初级A1部分,适用于Scala的初级应用开发学习。...

鸡蛋大王
09/29
0
0
java.util.regex Pattern 正则

/**String 中 replaceAll(),matches(),split() 等方法,都是调用Pattern中的方法。学习了,瞬间觉得Pattern强大了 public String replaceAll(String regex, String replacement) {return Pat......

happycode
2014/04/02
10.8K
1

没有更多内容

加载失败,请刷新页面

加载更多

linux 磁盘不足异常

linux 报 No space left on device 异常 ,则是磁盘不足 ,导致异常 运行 df -h 命令查询磁盘使用率,如果有100%,则查找目录大日志文件删除 1.磁盘不足导致系统应用写入文件失败,如系统日志...

zaolonglei
43分钟前
3
0
即学即用的 30 段 Python 实用代码

☞ 分享:最全最新的Python学习大礼包 ☜ 点击查看 编译:Pita & AI开发者,作者:Fatos Morina Python是目前最流行的语言之一,它在数据科学、机器学习、web开发、脚本编写、自动化方面被许...

Object_Man
44分钟前
5
0
The server time zone value 'EDT' is unrecognized or represents more than one time zone.

2019-10-14 18:07:43.714 ERROR 74363 --- [Druid-ConnectionPool-Create-1855026648] com.alibaba.druid.pool.DruidDataSource : create connection SQLException, url: jdbc:mysql://10.30......

yizhichao
57分钟前
9
0
html加载顺序以及影响页面二次渲染额的因素

本文转载于:专业的前端网站➱html加载顺序以及影响页面二次渲染额的因素 浏览器请求发往服务器以后,返回HTML页面,页面内容开始渲染,具体的执行顺序为: 1. 浏览器开始载入html代码,发现<...

前端老手
今天
9
0
BeginnersBook JSP、JSTL、Servlet 教程

来源:ApacheCN BeginnersBook 翻译项目 译者:飞龙 协议:CC BY-NC-SA 4.0 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 请您勇敢地去翻译和改进翻译。虽然我们追求卓越,但我们并...

ApacheCN_飞龙
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部