mirror of
https://gitee.com/dromara/hutool.git
synced 2025-06-28 13:34:09 +08:00
改进Calculator.conversion,兼容乘法符号省略写法
This commit is contained in:
parent
dc5992b139
commit
aef20c411d
@ -5,6 +5,7 @@
|
|||||||
# 5.8.16.M1 (2023-03-09)
|
# 5.8.16.M1 (2023-03-09)
|
||||||
|
|
||||||
### 🐣新特性
|
### 🐣新特性
|
||||||
|
* 【core 】 改进Calculator.conversion,兼容乘法符号省略写法(issue#2964@Github)
|
||||||
|
|
||||||
### 🐞Bug修复
|
### 🐞Bug修复
|
||||||
* 【crypto】 修复NoSuchMethodError未捕获问题(issue#2966@Github)
|
* 【crypto】 修复NoSuchMethodError未捕获问题(issue#2966@Github)
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package cn.hutool.core.math;
|
package cn.hutool.core.math;
|
||||||
|
|
||||||
|
import cn.hutool.core.lang.Console;
|
||||||
import cn.hutool.core.util.NumberUtil;
|
import cn.hutool.core.util.NumberUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
|
||||||
@ -37,7 +38,7 @@ public class Calculator {
|
|||||||
public double calculate(String expression) {
|
public double calculate(String expression) {
|
||||||
prepare(transform(expression));
|
prepare(transform(expression));
|
||||||
|
|
||||||
Stack<String> resultStack = new Stack<>();
|
final Stack<String> resultStack = new Stack<>();
|
||||||
Collections.reverse(postfixStack);// 将后缀式栈反转
|
Collections.reverse(postfixStack);// 将后缀式栈反转
|
||||||
String firstValue, secondValue, currentOp;// 参与计算的第一个值,第二个值和算术运算符
|
String firstValue, secondValue, currentOp;// 参与计算的第一个值,第二个值和算术运算符
|
||||||
while (false == postfixStack.isEmpty()) {
|
while (false == postfixStack.isEmpty()) {
|
||||||
@ -53,11 +54,14 @@ public class Calculator {
|
|||||||
firstValue = firstValue.replace("~", "-");
|
firstValue = firstValue.replace("~", "-");
|
||||||
secondValue = secondValue.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());
|
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) {
|
private void prepare(String expression) {
|
||||||
final Stack<Character> opStack = new Stack<>();
|
final Stack<Character> opStack = new Stack<>();
|
||||||
opStack.push(',');// 运算符放入栈底元素逗号,此符号优先级最低
|
opStack.push(',');// 运算符放入栈底元素逗号,此符号优先级最低
|
||||||
char[] arr = expression.toCharArray();
|
final char[] arr = expression.toCharArray();
|
||||||
int currentIndex = 0;// 当前字符的位置
|
int currentIndex = 0;// 当前字符的位置
|
||||||
int count = 0;// 上次算术运算符到本次算术运算符的字符的长度便于或者之间的数值
|
int count = 0;// 上次算术运算符到本次算术运算符的字符的长度便于或者之间的数值
|
||||||
char currentOp, peekOp;// 当前操作符和栈顶操作符
|
char currentOp, peekOp;// 当前操作符和栈顶操作符
|
||||||
@ -146,7 +150,7 @@ public class Calculator {
|
|||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
private BigDecimal calculate(String firstValue, String secondValue, char currentOp) {
|
private BigDecimal calculate(String firstValue, String secondValue, char currentOp) {
|
||||||
BigDecimal result;
|
final BigDecimal result;
|
||||||
switch (currentOp) {
|
switch (currentOp) {
|
||||||
case '+':
|
case '+':
|
||||||
result = NumberUtil.add(firstValue, secondValue);
|
result = NumberUtil.add(firstValue, secondValue);
|
||||||
|
@ -48,4 +48,11 @@ public class CalculatorTest {
|
|||||||
final double conversion = Calculator.conversion("((-2395+0) * 0.3+140.24+35+90)/30");
|
final double conversion = Calculator.conversion("((-2395+0) * 0.3+140.24+35+90)/30");
|
||||||
Assert.assertEquals(-15.11, conversion, 0.01);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
13
hutool-json/src/test/java/cn/hutool/json/Issue2953Test.java
Executable file
13
hutool-json/src/test/java/cn/hutool/json/Issue2953Test.java
Executable file
@ -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());
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user