jeval是为你的Java应用程序提供可加入的、高性能、数学、  布尔和函数表达式的解析和运算的高级资源包。

下载地址:http://www.oschina.net/p/jeval 目前最新版本是0.9.4 Beta

这个包可以为我们提高高效的数学表达式计算。

举个例子:这个是我们策划给出的游戏命中率的一部份计算公式

是否命中=a命中率 - (b等级 - a等级) * (命中系数(6)* b闪避率 / 100)+32

为了好象点,我们把他变成:ahit-(blv-alv)*(6*beva/100)+32

在平常我们看到这些都头痛,一般的处理方法是把非变量排除出来,想办法变成 常量+变量的形式
但这种式形的结果就是调整不方便,也加大了维护难度.

通常策划给出的每一个常量都是有意义的,改变一个常量就可以调整整个系统的命中率和其它相连数据。

也就是说常量可能会经常调整.

Jeval就是用在这种情况下的!!!!

接下来我们先看看jeval没有变量的例子

/**
* 测试jeval代码
*
* @author eric http://www.javagg.com
*/
public class JevalTest {

public static void main(String[] args) {
 // System.out.println(System.currentTimeMillis());
 Evaluator eva= new Evaluator();
 try {
  System.out.println(eva.evaluate("2+8/2"));
 } catch (EvaluationException e) {
  e.printStackTrace();
 }
}

}
运行,输出结果为

6.0

是不是好简单呢。

接下来看看有变量的,我们就用游戏命中率公式这个例子


/**
* 测试jeval代码
*
* @author eric http://www.javagg.com
*/
public class JevalTest {

public static void main(String[] args) {
 // 我们的游戏公式 ahit-(blv-alv)*(6*beva/100)+32
 Evaluator eva = new Evaluator();
 try {
  /** * 添加变量到 Evaluator 类实例. */
  eva.putVariable("ahit", "33");
  eva.putVariable("blv", "10");
  eva.putVariable("alv", "10");
  eva.putVariable("beva", "5");
  /** * 简单输出变量. */
  System.out.println(eva.evaluate("#{ahit}"));
  System.out.println(eva.evaluate("#{blv}"));
  System.out.println(eva.evaluate("#{alv}"));
  System.out.println(eva.evaluate("#{beva}"));
  //公式计算
  System.out.println(eva.evaluate("#{ahit}-(#{blv}-#{alv})*(6*#{beva}/100)+32"));
 } catch (EvaluationException e) {
  e.printStackTrace();
 }
}
}

输出:

33.0
10.0
10.0
5.0
65.0

到这里你已会使用jeval的基本功能了

别外jeval也可以做字符串的相加如:

System.out.println(eva.evaluate("'A' + 'C'"));

输出:AC

jeval自己也附带十多个数学函数,如:

System.out.println(eva.evaluate("round(3)"));//3的随机数

System.out.println(eva.evaluate("abs(-1)"));//绝对值

还有abs ,acos ,asin ,atan ,atan2 ,ceil ,cos ,exp ,floor ,log ,max ,min ,pow ,random ,rint ,round ,sin ,sqrt ,tan

如果不够用,还可以自己添加函数只要implements Function这个类就可以了


以上内容转载自:http://my.oschina.net/javagg/blog/3306


附:字符串表达式计算的另一种方法

JDK1.6提供了对Script(JSR223)的支持。

public class ExceptionUtilJeval {
    public static void main(String[] args) throws EvaluationException, ScriptException {
        String str = "1+2*3+3/4-2*6/3-2+4";
        Evaluator evaluator = new Evaluator();
        String result = evaluator.evaluate(str);
        System.out.println(result);
                                      
        ScriptEngineManager mgr = new ScriptEngineManager();   
        ScriptEngine engine = mgr.getEngineByExtension("js");
        Double result2 = (Double)engine.eval(str);
        System.out.println(result2);
    }
}