`

java解析表达式JEXL实现办法

阅读更多

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() ));
	}
}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics