diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a547b4a9..528e5efe8 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ # 5.8.16.M1 (2023-03-09) ### 🐣新特性 +* 【core 】 改进Calculator.conversion,兼容乘法符号省略写法(issue#2964@Github) ### 🐞Bug修复 * 【crypto】 修复NoSuchMethodError未捕获问题(issue#2966@Github) diff --git a/hutool-core/src/main/java/cn/hutool/core/math/Calculator.java b/hutool-core/src/main/java/cn/hutool/core/math/Calculator.java index 7e8ab30b0..cecd96232 100644 --- a/hutool-core/src/main/java/cn/hutool/core/math/Calculator.java +++ b/hutool-core/src/main/java/cn/hutool/core/math/Calculator.java @@ -1,5 +1,6 @@ package cn.hutool.core.math; +import cn.hutool.core.lang.Console; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; @@ -37,7 +38,7 @@ public class Calculator { public double calculate(String expression) { prepare(transform(expression)); - Stack resultStack = new Stack<>(); + final Stack resultStack = new Stack<>(); Collections.reverse(postfixStack);// 将后缀式栈反转 String firstValue, secondValue, currentOp;// 参与计算的第一个值,第二个值和算术运算符 while (false == postfixStack.isEmpty()) { @@ -53,11 +54,14 @@ public class Calculator { firstValue = firstValue.replace("~", "-"); secondValue = secondValue.replace("~", "-"); - BigDecimal tempResult = calculate(firstValue, secondValue, currentOp.charAt(0)); + final BigDecimal tempResult = calculate(firstValue, secondValue, currentOp.charAt(0)); resultStack.push(tempResult.toString()); } } - return Double.parseDouble(resultStack.pop()); + + // 当结果集中有多个数字时,可能是省略*,类似(1+2)3 + return NumberUtil.mul(resultStack.toArray(new String[0])).doubleValue(); + //return Double.parseDouble(resultStack.pop()); } /** @@ -68,7 +72,7 @@ public class Calculator { private void prepare(String expression) { final Stack opStack = new Stack<>(); opStack.push(',');// 运算符放入栈底元素逗号,此符号优先级最低 - char[] arr = expression.toCharArray(); + final char[] arr = expression.toCharArray(); int currentIndex = 0;// 当前字符的位置 int count = 0;// 上次算术运算符到本次算术运算符的字符的长度便于或者之间的数值 char currentOp, peekOp;// 当前操作符和栈顶操作符 @@ -146,7 +150,7 @@ public class Calculator { * @return 结果 */ private BigDecimal calculate(String firstValue, String secondValue, char currentOp) { - BigDecimal result; + final BigDecimal result; switch (currentOp) { case '+': result = NumberUtil.add(firstValue, secondValue); diff --git a/hutool-core/src/test/java/cn/hutool/core/math/CalculatorTest.java b/hutool-core/src/test/java/cn/hutool/core/math/CalculatorTest.java index e28537049..ab04e1685 100644 --- a/hutool-core/src/test/java/cn/hutool/core/math/CalculatorTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/math/CalculatorTest.java @@ -48,4 +48,11 @@ public class CalculatorTest { final double conversion = Calculator.conversion("((-2395+0) * 0.3+140.24+35+90)/30"); Assert.assertEquals(-15.11, conversion, 0.01); } + + @Test + public void issue2964Test() { + // https://github.com/dromara/hutool/issues/2964 + final double calcValue = Calculator.conversion("(11+2)12"); + Assert.assertEquals(156D, calcValue, 0.001); + } } diff --git a/hutool-json/src/test/java/cn/hutool/json/Issue2953Test.java b/hutool-json/src/test/java/cn/hutool/json/Issue2953Test.java new file mode 100755 index 000000000..2096a3ebe --- /dev/null +++ b/hutool-json/src/test/java/cn/hutool/json/Issue2953Test.java @@ -0,0 +1,13 @@ +package cn.hutool.json; + +import org.junit.Assert; +import org.junit.Test; + +public class Issue2953Test { + @Test + public void parseObjWithBigNumberTest() { + final String a = "{\"a\": 114793903847679990000000000000000000000}"; + final JSONObject jsonObject = JSONUtil.parseObj(a, JSONConfig.create()); + Assert.assertEquals("{\"a\":\"114793903847679990000000000000000000000\"}", jsonObject.toString()); + } +}