需求,实现表达式的计算
例子:
输入: 表达式字符串“200 * 50% + 金额”, 变量:金额 = 100。
输出:200.0
解决方案:采用阿里开源的轻量表达式引擎Aviator实现
<!-- pom.xml-->
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>5.2.5</version>
</dependency>
public static void main(String[] args) {
String expr = "200 * 50% + 金额";
Double execute = (Double) AviatorEvaluator.execute(expr, Collections.singletonMap("金额", 100));
System.out.println(execute);
}
## 坑,报错了,原来Aviator不支持百分号
Exception in thread "main" com.googlecode.aviator.exception.ExpressionSyntaxErrorException: Syntax error: invalid token at 10, lineNumber: 1, token : [type='Char',lexeme='+',index=10],
while parsing expression: `
200 * 50% + 金额^^^
正则表达式,处理一下百分号,把50%替换为0.5
/**
* JAVA转义符要双斜杠\\表示
* 括号表示分组,我们要提取group(1)数字,不要百分号符号
* \\.?表示可能会出现分数,?表示出现0或者1次
*/
private static final Pattern PATTERN = Pattern.compile("(\\d+\\.?\\d+)\\%");
public static void main(String[] args) {
String expr = "200 * 50% + 金额";
Matcher m = PATTERN.matcher(expr);
String matchedText = "";
StringBuffer sb = new StringBuffer();
while (m.find()) {
matchedText = m.group(1);
float num = Float.parseFloat(matchedText) / 100f;
//字符串replace
m.appendReplacement(sb, String.valueOf(num));
}
//剩下的字符串append
m.appendTail(sb);
//传入变量
Double execute = (Double) AviatorEvaluator.execute(sb.toString(), Collections.singletonMap("金额", 100));
System.out.println(execute);
}
// 打印200.0成功