今天遇到了一个需要将数据库中保存的表达式,替换其中的字符,并计算出值,java是不能直接计算的例如:
Java代码
double d = (3+5-(2-4)*2)/24;没有问题
但是:遇到 "(3+5-(2-4)*2)/24" 字符串的格式,就不能使用了
java是无法解决,但是javaScript中有一个eval函数是可以执行的,所以,可以通过其他途径执行javaScript就可以做到,而ScriptEngine是java的一个javaScript实现类,所以就找到了方法,详细方法见下
Java代码
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+"%");
}
}
}
通过以上的方法即可实现此方法。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。