今天遇到了一个需要将数据库中保存的表达式,替换其中的字符,并计算出值,java是不能直接计算的例如:
java是无法解决,但是javaScript中有一个eval函数是可以执行的,所以,可以通过其他途径执行javaScript就可以做到,而ScriptEngine是java的一个javaScript实现类,所以就找到了方法,详细方法见下
通过以上的方法即可实现此方法。
- 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+"%");
- }
- }
- }
通过以上的方法即可实现此方法。