EvalEx is a handy expression evaluator for Java, that allows to evaluate simple mathematical and boolean expressions.
Key Features:
- Uses BigDecimal for calculation and result
- Single class implementation, very compact
- No dependencies to external libraries
- Precision and rounding mode can be set
- Supports variables
- Standard boolean and mathematical operators
- Standard basic mathematical and boolean functions
- Custom functions and operators can be added at runtime
BigDecimal result = null;
Expression expression = new Expression("1+1/3");
result = expression.eval():
expression.setPrecision(2);
result = expression.eval():
result = new Expression("(3.4 + -4.1)/2").eval();
result = new Expression("SQRT(a^2 + b^2").with("a","2.4").and("b","9.253").eval();
BigDecimal a = new BigDecimal("2.4");
BigDecimal b = new BigDecimal("9.235");
result = new Expression("SQRT(a^2 + b^2").with("a",a).and("b",b).eval();
result = new Expression("2.4/PI").setPrecision(128).setRoundingMode(RoundingMode.UP).eval();
result = new Expression("random() > 0.5").eval();
result = new Expression("not(x<7 || sqrt(max(x,9)) <= 3))").with("x","22.9").eval();
Mathematical Operators | |
---|---|
Operator | Description |
+ | Additive operator |
- | Subtraction operator |
* | Multiplication operator |
/ | Division operator |
% | Remainder operator (Modulo) |
^ | Power operator |
Boolean Operators* | |
---|---|
Operator | Description |
= | Equals |
== | Equals |
!= | Not equals |
<> | Not equals |
< | Less than |
<= | Less than or equal to |
> | Greater than |
>= | Greater than or equal to |
&& | Boolean and |
|| | Boolean or |
Function* | Description |
---|---|
NOT(expression) | Boolean negation, 1 (means true) if the expression is not zero |
RANDOM() | Produces a random number between 0 and 1 |
MIN(e1,e2) | Returns the smaller of both expressions |
MAX(e1,e2) | Returns the bigger of both expressions |
ABS(expression) | Returns the absolute (non-negative) value of the expression |
ROUND(expression,precision) | Rounds a value to a certain number of digits, uses the current rounding mode |
LOG(expression) | Returns the natural logarithm (base e) of an expression |
SQRT(expression) | Returns the square root of an expression |
SIN(expression) | Returns the trigonometric sine of an angle (in degrees) |
COS(expression) | Returns the trigonometric cosine of an angle (in degrees) |
TAN(expression) | Returns the trigonometric tangens of an angle (in degrees) |
SINH(expression) | Returns the hyperbolic sine of a value |
COSH(expression) | Returns the hyperbolic cosine of a value |
TANH(expression) | Returns the hyperbolic tangens of a value |
RAD(expression) | Converts an angle measured in degrees to an approximately equivalent angle measured in radians |
DEG(expression) | Converts an angle measured in radians to an approximately equivalent angle measured in degrees |
Constant | Description |
---|---|
PI | The value of PI, exact to 100 digits |
Custom operators can be added easily, simply create an instance of Expression.Operator
and add it to the expression.
Parameters are the operator string, its precedence and if it is left associative. The operators eval()
method will be called with the BigDecimal values of the operands.
All existing operators can also be overridden.
For example, add an operator x >> n
, that moves the decimal point of x n digits to the right:
Expression e = new Expression("2.1234 >> 2");
e.addOperator(e.new Operator(">>", 30, true) {
@Override
public BigDecimal eval(BigDecimal v1, BigDecimal v2) {
return v1.movePointRight(v2.toBigInteger().intValue());
}
});
e.eval(); // returns 212.34
Adding custom functions is as easy as adding custom operators. Create an instance of Expression.Function
and add it to the expression.
Parameters are the function name and the count of required parameters. The functions eval()
method will be called with a list of the BigDecimal parameters.
All existing functions can also be overridden.
For example, add a function average(a,b,c)
, that will calculate the average value of a, b and c:
Expression e = new Expression("2 * average(12,4,8)");
e.addFunction(e.new Function("average", 3) {
@Override
public BigDecimal eval(List<BigDecimal> parameters) {
BigDecimal sum = parameters.get(0).add(parameters.get(1)).add(parameters.get(2));
return sum.divide(new BigDecimal(3));
}
});
e.eval(); // returns 16
The software was created and tested using Java 1.6.0.
src/ The Java sources
tests/ JUnit tests
Copyright 2012 by Udo Klimaschewski
http://about.me/udo.klimaschewski
The software is licensed under the MIT Open Source license (see LICENSE file).
- The power of operator (^) implementation was copied from Stack Overflow Thanks to Gene Marin
- The SQRT() function implementation was taken from the book The Java Programmers Guide To numerical Computing (Ronald Mak, 2002)