// 公式计算-自定义公式
// 公式:运维单数F*系数f1 + 运单价格T*系数t1 +总价A*系数a1 +评价P*系数P1
/*
* org.codehaus.groovy
* groovy-all2.4.7
*/
public static double countGrovovy() {
Binding binding = new Binding();
// 值
binding.setVariable("F", 150);
binding.setVariable("T", 60000);
binding.setVariable("A", 300000);
binding.setVariable("P", 10);
// 系数
binding.setVariable("F1", 1.2);
binding.setVariable("T1", 1.7);
binding.setVariable("A1", 1.2);
binding.setVariable("P1", 0.5);
binding.setVariable("language", "Groovy");
GroovyShell shell = new GroovyShell(binding);
Object F1 = shell.evaluate("P2=F*F1 + T*T1 +A*A1 +P*P1; return P2 ");
// Object F2 = shell.evaluate("P1=P0*(0.055*0.20+1.0011)+A; return P1 ");
double d = (150 * 1.2) + (60000 * 1.7) + (300000 * 1.2) + (10 * 0.5);
System.out.println("手动计算:" + d);
System.out.println("自定义公式计算:" + F1);
// System.out.println(F2);
return Double.valueOf(F1.toString());
}
// 自定义公式2
public static double countGrovovy2() {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
Compilable compilable = (Compilable) engine;
Bindings bindings = engine.createBindings(); // Local级别的Binding
String script = "F*F1 + T*T1 +A*A1 +P*P1"; // 定义函数并调用
CompiledScript JSFunction = null; // 解析编译脚本函数
try {
JSFunction = compilable.compile(script);
bindings.put("F", 150);
bindings.put("T", 60000);
bindings.put("A", 300000);
bindings.put("P", 10);
// 系数
bindings.put("F1", 1.2);
bindings.put("T1", 1.7);
bindings.put("A1", 1.2);
bindings.put("P1", 0.5);
Object result = JSFunction.eval(bindings);
System.out.println("自定义公式2:==" + result); // 调用缓存着的脚本函数对象,Bindings作为参数容器传入
return Double.valueOf(result.toString());
} catch (javax.script.ScriptException e) {
e.printStackTrace();
return 0;
}
// return Double.valueOf(result.toString());
}
来源:oschina
链接:https://my.oschina.net/mellen/blog/4466766