Commit 9ab5b273 authored by liwenbin's avatar liwenbin

修复EL表达式支持数字以外的变量,并且修复=,!=判断的bug

parent a9a0a33e
......@@ -26,8 +26,6 @@ package com.quantgroup.asset.distribution.util.calc;
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/
import com.google.common.collect.Sets;
import lombok.Getter;
import lombok.Setter;
......@@ -674,8 +672,13 @@ public class Expression {
if (v1 == null || v2 == null) {
return BigDecimal.ZERO;
}
return new BigDecimal(v1).compareTo(new BigDecimal(v2)) == 0 ? BigDecimal.ONE
: BigDecimal.ZERO;
if (v1.equals(v2)) {
return BigDecimal.ONE;
} else {
return BigDecimal.ZERO;
}
// return new BigDecimal(v1).compareTo(new BigDecimal(v2)) == 0 ? BigDecimal.ONE
// : BigDecimal.ZERO;
}
});
addOperator(new Operator("==", OPERATOR_PRECEDENCE_EQUALITY, false, true) {
......@@ -694,8 +697,11 @@ public class Expression {
if (v1 == null || v2 == null) {
return BigDecimal.ONE;
}
return new BigDecimal(v1).compareTo(new BigDecimal(v2)) != 0 ? BigDecimal.ONE
: BigDecimal.ZERO;
if (!v1.equals(v2)) {
return BigDecimal.ONE;
} else {
return BigDecimal.ZERO;
}
}
});
addOperator(new Operator("<>", OPERATOR_PRECEDENCE_EQUALITY, false, true) {
......@@ -1400,7 +1406,8 @@ public class Expression {
stack.push(() -> {
LazyNumber lazyVariable = variables.get(token.surface);
String value = lazyVariable == null ? null : lazyVariable.eval();
return value == null ? null : new BigDecimal(value).round(mc).toPlainString();
// return value == null ? null : new BigDecimal(value).round(mc).toPlainString();
return value == null ? null : value;
});
break;
case FUNCTION:
......@@ -1570,26 +1577,32 @@ public class Expression {
variables.put(variable, CreateLazyNumber(new BigDecimal(value, mc).toPlainString()));
} else if (value.equalsIgnoreCase("null")) {
variables.put(variable, null);
} else if (value.equalsIgnoreCase("e") ||
value.equalsIgnoreCase("PI") ||
value.equalsIgnoreCase("TRUE")||
value.equalsIgnoreCase("FALSE")) {
final String expStr = value;
variables.put(variable, new LazyNumber() {
private final Map<String, LazyNumber> outerVariables = variables;
private final Map<String, com.quantgroup.asset.distribution.util.calc.LazyFunction>
outerFunctions = functions;
private final Map<String, LazyOperator> outerOperators = operators;
private final String innerExpressionString = expStr;
private final MathContext inneMc = mc;
@Override
public String eval() {
Expression innerE = new Expression(innerExpressionString, inneMc);
innerE.variables = outerVariables;
innerE.functions = outerFunctions;
innerE.operators = outerOperators;
BigDecimal val = innerE.eval();
return val.toPlainString();
}
});
rpn = null;
} else {
final String expStr = value;
variables.put(variable, new LazyNumber() {
private final Map<String, LazyNumber> outerVariables = variables;
private final Map<String, com.quantgroup.asset.distribution.util.calc.LazyFunction>
outerFunctions = functions;
private final Map<String, LazyOperator> outerOperators = operators;
private final String innerExpressionString = expStr;
private final MathContext inneMc = mc;
@Override
public String eval() {
Expression innerE = new Expression(innerExpressionString, inneMc);
innerE.variables = outerVariables;
innerE.functions = outerFunctions;
innerE.operators = outerOperators;
BigDecimal val = innerE.eval();
return val.toPlainString();
}
});
variables.put(variable, CreateLazyNumber(value));
rpn = null;
}
return this;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment