需求争便,實(shí)現(xiàn)表達(dá)式的計(jì)算
例子:
輸入: 表達(dá)式字符串“200 * 50% + 金額”浮毯, 變量:金額 = 100完疫。
輸出:200.0
解決方案:采用阿里開源的輕量表達(dá)式引擎Aviator實(shí)現(xiàn)
<!-- 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);
}
## 坑,報(bào)錯了债蓝,原來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% + 金額^^^
正則表達(dá)式壳鹤,處理一下百分號,把50%替換為0.5
/**
* JAVA轉(zhuǎn)義符要雙斜杠\\表示
* 括號表示分組饰迹,我們要提取group(1)數(shù)字,不要百分號符號
* \\.?表示可能會出現(xiàn)分?jǐn)?shù)芳誓,?表示出現(xiàn)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));
}
//剩下的字符串a(chǎn)ppend
m.appendTail(sb);
//傳入變量
Double execute = (Double) AviatorEvaluator.execute(sb.toString(), Collections.singletonMap("金額", 100));
System.out.println(execute);
}
// 打印200.0成功