public class Expression
extends java.lang.Object
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 |
IF(condition,value_if_true,value_if_false) | Returns one value if the condition evaluates to true or the other if it evaluates to false |
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 |
FLOOR(expression) | Rounds the value down to the nearest integer |
CEILING(expression) | Rounds the value up to the nearest integer |
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 |
TRUE | The value one |
FALSE | The value zero |
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
Expression e = new Expression("2 * average(12,4,8)"); e.addFunction(e.new Function("average", 3) { @Override public BigDecimal eval(ListThe software is licensed under the MIT Open Source license (see LICENSE file).parameters) { BigDecimal sum = parameters.get(0).add(parameters.get(1)).add(parameters.get(2)); return sum.divide(new BigDecimal(3)); } }); e.eval(); // returns 16
Modifier and Type | Class and Description |
---|---|
class |
Expression.Assignment
Marker class for assignment operators.
|
class |
Expression.Comma |
class |
Expression.Comparator |
class |
Expression.Constant |
class |
Expression.ExpressionException
The expression evaluators exception class.
|
class |
Expression.Function
Abstract definition of a supported expression function.
|
class |
Expression.LeftParen |
class |
Expression.Operator
Abstract definition of a supported operator.
|
(package private) static interface |
Expression.Token |
private class |
Expression.Tokenizer
Expression tokenizer that allows to iterate over a
String
expression token by token. |
class |
Expression.Variable |
Modifier and Type | Field and Description |
---|---|
private java.util.Map<java.lang.String,java.lang.Object> |
constants
All defined variables with name and value.
|
private char |
decimalSeparator
What character to use for decimal separators.
|
private java.lang.String |
expression
The original infix expression.
|
private java.util.Map<java.lang.String,Expression.Function> |
functions
All defined functions with name and implementation.
|
private java.math.MathContext |
mc
The
MathContext to use for calculations. |
private char |
minusSign
What character to use for minus sign (negative values).
|
private java.util.Map<java.lang.String,Expression.Operator> |
operators
All defined operators with name and implementation.
|
static java.math.BigDecimal |
PI
Definition of PI as a constant, can be used in expressions as variable.
|
private java.util.List<Expression.Token> |
rpn
The cached RPN (Reverse Polish Notation) of the expression.
|
Constructor and Description |
---|
Expression(java.lang.String expression)
Creates a new expression instance from an expression string.
|
Modifier and Type | Method and Description |
---|---|
Expression |
addConstant(java.lang.String name,
java.lang.Object value)
Sets a constant value.
|
Expression.Function |
addFunction(Expression.Function function)
Adds a function to the list of supported functions
|
Expression.Operator |
addOperator(Expression.Operator operator)
Adds an operator to the list of supported operators.
|
java.lang.Object |
eval()
Evaluates the expression.
|
java.lang.Object |
eval(java.util.Map<java.lang.String,java.lang.Object> variables)
Evaluates the expression.
|
java.util.Iterator<java.lang.String> |
getExpressionTokenizer()
Get an iterator for this expression, allows iterating over an expression
token by token.
|
private java.util.List<Expression.Token> |
getRPN()
Cached access to the RPN notation of this expression, ensures only one
calculation of the RPN per expression instance.
|
private boolean |
isNumber(java.lang.Object obj) |
private boolean |
isNumber(java.lang.String st)
Is the string a number?
|
Expression |
setPrecision(int precision)
Sets the precision for expression evaluation.
|
Expression |
setRoundingMode(java.math.RoundingMode roundingMode)
Sets the rounding mode for expression evaluation.
|
private java.util.List<Expression.Token> |
shuntingYard(java.lang.String expression)
Implementation of the Shunting Yard algorithm to transform an
infix expression to a RPN expression.
|
private java.math.BigDecimal |
toBigDecimal(java.util.Map<java.lang.String,java.lang.Object> variables,
java.lang.Object o) |
private java.math.BigDecimal |
toBigDecimal(java.lang.Object o) |
private java.lang.Number |
toResult(java.math.BigDecimal r) |
java.lang.String |
toRPN()
Get a string representation of the RPN (Reverse Polish Notation) for this
expression.
|
public static final java.math.BigDecimal PI
private java.math.MathContext mc
MathContext
to use for calculations.private java.lang.String expression
private java.util.List<Expression.Token> rpn
private java.util.Map<java.lang.String,Expression.Operator> operators
private java.util.Map<java.lang.String,Expression.Function> functions
private java.util.Map<java.lang.String,java.lang.Object> constants
private final char decimalSeparator
private final char minusSign
public Expression(java.lang.String expression)
expression
- The expression. E.g. "2.4*sin(3)/(2-4)"
or
"sin(y)>0 & max(z, 3)>3"
private boolean isNumber(java.lang.String st)
st
- The string.true
, if the input string is a number.private boolean isNumber(java.lang.Object obj)
private java.util.List<Expression.Token> shuntingYard(java.lang.String expression)
expression
- The input expression in infx.public java.lang.Object eval()
public java.lang.Object eval(java.util.Map<java.lang.String,java.lang.Object> variables)
private java.lang.Number toResult(java.math.BigDecimal r)
private java.math.BigDecimal toBigDecimal(java.util.Map<java.lang.String,java.lang.Object> variables, java.lang.Object o)
private java.math.BigDecimal toBigDecimal(java.lang.Object o)
public Expression setPrecision(int precision)
precision
- The new precision.public Expression setRoundingMode(java.math.RoundingMode roundingMode)
roundingMode
- The new rounding mode.public Expression.Operator addOperator(Expression.Operator operator)
operator
- The operator to add.null
if
there was none.public Expression.Function addFunction(Expression.Function function)
function
- The function to add.null
if
there was none.public Expression addConstant(java.lang.String name, java.lang.Object value)
name
- The constant name.value
- The constant value.public java.util.Iterator<java.lang.String> getExpressionTokenizer()
private java.util.List<Expression.Token> getRPN()
public java.lang.String toRPN()