1. FormulaCalculator类
package test;
import java.util.Map;
import org.apache.commons.jexl.Expression;
import org.apache.commons.jexl.ExpressionFactory;
import org.apache.commons.jexl.JexlContext;
public class FormulaCalculator {
String _formula;
JexlContext _jexlContext;
Map _varMap;
public FormulaCalculator(){
_jexlContext = new JexlContext(){
public Map getVars() {
return _varMap;
}
public void setVars(Map vars) {
_varMap.clear();
_varMap.putAll( vars );
}
};
}
public void setFormula(String formula) throws Exception{
validateFormula( formula );
_formula = formula;
}
public void setVars(Map<String, Number> vars){
_varMap = vars;
}
public Number calculate() throws Exception{
Expression e = ExpressionFactory.createExpression( _formula );
return (Number) e.evaluate( _jexlContext );
}
private void validateFormula( String formula ) throws Exception{
// FIXME: implementation
}
}
2. 测试类
package test;
import java.util.HashMap;
import java.util.Map;
import junit.framework.TestCase;
import org.junit.Assert;
public class FormulaCalculatorTest extends TestCase{
public void testCalculate() throws Exception{
String formula = "3+2";
FormulaCalculator cal = new FormulaCalculator();
cal.setFormula(formula);
cal.setVars(null);
Number n = cal.calculate();
Assert.assertEquals( 5, Integer.parseInt( n.toString() ));
String formula2 = "n1+n2+3";
cal.setFormula(formula2);
Map<String, Number> mapVars = new HashMap<String, Number>();
mapVars.put( "n1", 2);
mapVars.put( "n2", 3);
cal.setFormula( formula2);
cal.setVars( mapVars);
Number n2 = cal.calculate();
Assert.assertEquals(8, Integer.parseInt( n2.toString() ));
}
}