NumberUtil.parseInt忽略科学计数法

This commit is contained in:
Looly 2022-08-15 10:10:17 +08:00
parent e6b89806f4
commit 2f66008d02
3 changed files with 69 additions and 46 deletions

View File

@ -8,6 +8,7 @@
### 🐣新特性 ### 🐣新特性
* 【core 】 CollUtil新增addIfAbsent方法pr#750@Gitee * 【core 】 CollUtil新增addIfAbsent方法pr#750@Gitee
* 【core 】 DateUtil.parseUTC支持只有时分的格式issue#I5M6DP@Gitee * 【core 】 DateUtil.parseUTC支持只有时分的格式issue#I5M6DP@Gitee
* 【core 】 NumberUtil.parseInt忽略科学计数法issue#I5M55F@Gitee
* *
### 🐞Bug修复 ### 🐞Bug修复
* 【http 】 修复https下可能的Patch、Get请求失效问题issue#I3Z3DH@Gitee * 【http 】 修复https下可能的Patch、Get请求失效问题issue#I3Z3DH@Gitee

View File

@ -2441,6 +2441,11 @@ public class NumberUtil {
return 0; return 0;
} }
if(StrUtil.containsIgnoreCase(number, "E")){
// 科学计数法忽略支持科学计数法一般用于表示非常小和非常大的数字这类数字转换为int后精度丢失没有意义
throw new NumberFormatException(StrUtil.format("Unsupported int format: [{}]", number));
}
if (StrUtil.startWithIgnoreCase(number, "0x")) { if (StrUtil.startWithIgnoreCase(number, "0x")) {
// 0x04表示16进制数 // 0x04表示16进制数
return Integer.parseInt(number.substring(2), 16); return Integer.parseInt(number.substring(2), 16);

View File

@ -20,37 +20,37 @@ public class NumberUtilTest {
@Test @Test
public void addTest() { public void addTest() {
Float a = 3.15f; final Float a = 3.15f;
Double b = 4.22; final Double b = 4.22;
double result = NumberUtil.add(a, b).doubleValue(); final double result = NumberUtil.add(a, b).doubleValue();
Assert.assertEquals(7.37, result, 2); Assert.assertEquals(7.37, result, 2);
} }
@Test @Test
public void addTest2() { public void addTest2() {
double a = 3.15f; final double a = 3.15f;
double b = 4.22; final double b = 4.22;
double result = NumberUtil.add(a, b); final double result = NumberUtil.add(a, b);
Assert.assertEquals(7.37, result, 2); Assert.assertEquals(7.37, result, 2);
} }
@Test @Test
public void addTest3() { public void addTest3() {
float a = 3.15f; final float a = 3.15f;
double b = 4.22; final double b = 4.22;
double result = NumberUtil.add(a, b, a, b).doubleValue(); final double result = NumberUtil.add(a, b, a, b).doubleValue();
Assert.assertEquals(14.74, result, 2); Assert.assertEquals(14.74, result, 2);
} }
@Test @Test
public void addTest4() { public void addTest4() {
BigDecimal result = NumberUtil.add(new BigDecimal("133"), new BigDecimal("331")); final BigDecimal result = NumberUtil.add(new BigDecimal("133"), new BigDecimal("331"));
Assert.assertEquals(new BigDecimal("464"), result); Assert.assertEquals(new BigDecimal("464"), result);
} }
@Test @Test
public void addBlankTest(){ public void addBlankTest(){
BigDecimal result = NumberUtil.add("123", " "); final BigDecimal result = NumberUtil.add("123", " ");
Assert.assertEquals(new BigDecimal("123"), result); Assert.assertEquals(new BigDecimal("123"), result);
} }
@ -89,13 +89,13 @@ public class NumberUtilTest {
@Test @Test
public void divTest() { public void divTest() {
double result = NumberUtil.div(0, 1); final double result = NumberUtil.div(0, 1);
Assert.assertEquals(0.0, result, 0); Assert.assertEquals(0.0, result, 0);
} }
@Test @Test
public void divBigDecimalTest() { public void divBigDecimalTest() {
BigDecimal result = NumberUtil.div(BigDecimal.ZERO, BigDecimal.ONE); final BigDecimal result = NumberUtil.div(BigDecimal.ZERO, BigDecimal.ONE);
Assert.assertEquals(BigDecimal.ZERO, result.stripTrailingZeros()); Assert.assertEquals(BigDecimal.ZERO, result.stripTrailingZeros());
} }
@ -103,39 +103,39 @@ public class NumberUtilTest {
public void roundTest() { public void roundTest() {
// 四舍 // 四舍
String round1 = NumberUtil.roundStr(2.674, 2); final String round1 = NumberUtil.roundStr(2.674, 2);
String round2 = NumberUtil.roundStr("2.674", 2); final String round2 = NumberUtil.roundStr("2.674", 2);
Assert.assertEquals("2.67", round1); Assert.assertEquals("2.67", round1);
Assert.assertEquals("2.67", round2); Assert.assertEquals("2.67", round2);
// 五入 // 五入
String round3 = NumberUtil.roundStr(2.675, 2); final String round3 = NumberUtil.roundStr(2.675, 2);
String round4 = NumberUtil.roundStr("2.675", 2); final String round4 = NumberUtil.roundStr("2.675", 2);
Assert.assertEquals("2.68", round3); Assert.assertEquals("2.68", round3);
Assert.assertEquals("2.68", round4); Assert.assertEquals("2.68", round4);
// 四舍六入五成双 // 四舍六入五成双
String round31 = NumberUtil.roundStr(4.245, 2, RoundingMode.HALF_EVEN); final String round31 = NumberUtil.roundStr(4.245, 2, RoundingMode.HALF_EVEN);
String round41 = NumberUtil.roundStr("4.2451", 2, RoundingMode.HALF_EVEN); final String round41 = NumberUtil.roundStr("4.2451", 2, RoundingMode.HALF_EVEN);
Assert.assertEquals("4.24", round31); Assert.assertEquals("4.24", round31);
Assert.assertEquals("4.25", round41); Assert.assertEquals("4.25", round41);
// 补0 // 补0
String round5 = NumberUtil.roundStr(2.6005, 2); final String round5 = NumberUtil.roundStr(2.6005, 2);
String round6 = NumberUtil.roundStr("2.6005", 2); final String round6 = NumberUtil.roundStr("2.6005", 2);
Assert.assertEquals("2.60", round5); Assert.assertEquals("2.60", round5);
Assert.assertEquals("2.60", round6); Assert.assertEquals("2.60", round6);
// 补0 // 补0
String round7 = NumberUtil.roundStr(2.600, 2); final String round7 = NumberUtil.roundStr(2.600, 2);
String round8 = NumberUtil.roundStr("2.600", 2); final String round8 = NumberUtil.roundStr("2.600", 2);
Assert.assertEquals("2.60", round7); Assert.assertEquals("2.60", round7);
Assert.assertEquals("2.60", round8); Assert.assertEquals("2.60", round8);
} }
@Test @Test
public void roundStrTest() { public void roundStrTest() {
String roundStr = NumberUtil.roundStr(2.647, 2); final String roundStr = NumberUtil.roundStr(2.647, 2);
Assert.assertEquals(roundStr, "2.65"); Assert.assertEquals(roundStr, "2.65");
} }
@ -174,46 +174,46 @@ public class NumberUtilTest {
@Test @Test
public void decimalFormatTest() { public void decimalFormatTest() {
long c = 299792458;// 光速 final long c = 299792458;// 光速
String format = NumberUtil.decimalFormat(",###", c); final String format = NumberUtil.decimalFormat(",###", c);
Assert.assertEquals("299,792,458", format); Assert.assertEquals("299,792,458", format);
} }
@Test(expected = IllegalArgumentException.class) @Test(expected = IllegalArgumentException.class)
public void decimalFormatNaNTest(){ public void decimalFormatNaNTest(){
Double a = 0D; final Double a = 0D;
Double b = 0D; final Double b = 0D;
Double c = a / b; final Double c = a / b;
Console.log(NumberUtil.decimalFormat("#%", c)); Console.log(NumberUtil.decimalFormat("#%", c));
} }
@Test(expected = IllegalArgumentException.class) @Test(expected = IllegalArgumentException.class)
public void decimalFormatNaNTest2(){ public void decimalFormatNaNTest2(){
Double a = 0D; final Double a = 0D;
Double b = 0D; final Double b = 0D;
Console.log(NumberUtil.decimalFormat("#%", a / b)); Console.log(NumberUtil.decimalFormat("#%", a / b));
} }
@Test @Test
public void decimalFormatDoubleTest() { public void decimalFormatDoubleTest() {
Double c = 467.8101; final Double c = 467.8101;
String format = NumberUtil.decimalFormat("0.00", c); final String format = NumberUtil.decimalFormat("0.00", c);
Assert.assertEquals("467.81", format); Assert.assertEquals("467.81", format);
} }
@Test @Test
public void decimalFormatMoneyTest() { public void decimalFormatMoneyTest() {
double c = 299792400.543534534; final double c = 299792400.543534534;
String format = NumberUtil.decimalFormatMoney(c); final String format = NumberUtil.decimalFormatMoney(c);
Assert.assertEquals("299,792,400.54", format); Assert.assertEquals("299,792,400.54", format);
double value = 0.5; final double value = 0.5;
String money = NumberUtil.decimalFormatMoney(value); final String money = NumberUtil.decimalFormatMoney(value);
Assert.assertEquals("0.50", money); Assert.assertEquals("0.50", money);
} }
@ -224,7 +224,7 @@ public class NumberUtilTest {
@Test @Test
public void toBigDecimalTest() { public void toBigDecimalTest() {
double a = 3.14; final double a = 3.14;
BigDecimal bigDecimal = NumberUtil.toBigDecimal(a); BigDecimal bigDecimal = NumberUtil.toBigDecimal(a);
Assert.assertEquals("3.14", bigDecimal.toString()); Assert.assertEquals("3.14", bigDecimal.toString());
@ -238,13 +238,13 @@ public class NumberUtilTest {
@Test @Test
public void maxTest() { public void maxTest() {
int max = NumberUtil.max(5,4,3,6,1); final int max = NumberUtil.max(5,4,3,6,1);
Assert.assertEquals(6, max); Assert.assertEquals(6, max);
} }
@Test @Test
public void minTest() { public void minTest() {
int min = NumberUtil.min(5,4,3,6,1); final int min = NumberUtil.min(5,4,3,6,1);
Assert.assertEquals(1, min); Assert.assertEquals(1, min);
} }
@ -283,27 +283,44 @@ public class NumberUtilTest {
public void parseIntTest2() { public void parseIntTest2() {
// from 5.4.8 issue#I23ORQ@Gitee // from 5.4.8 issue#I23ORQ@Gitee
// 千位分隔符去掉 // 千位分隔符去掉
int v1 = NumberUtil.parseInt("1,482.00"); final int v1 = NumberUtil.parseInt("1,482.00");
Assert.assertEquals(1482, v1); Assert.assertEquals(1482, v1);
} }
@Test(expected = NumberFormatException.class) @Test(expected = NumberFormatException.class)
public void parseIntTest3() { public void parseIntTest3() {
int v1 = NumberUtil.parseInt("d"); final int v1 = NumberUtil.parseInt("d");
Assert.assertEquals(0, v1); Assert.assertEquals(0, v1);
} }
@Test(expected = NumberFormatException.class)
public void parseNumberTest4(){
// issue#I5M55F
// 科学计数法忽略支持科学计数法一般用于表示非常小和非常大的数字这类数字转换为int后精度丢失没有意义
final String numberStr = "429900013E20220812163344551";
NumberUtil.parseInt(numberStr);
}
@Test @Test
public void parseNumberTest() { public void parseNumberTest() {
// from 5.4.8 issue#I23ORQ@Gitee // from 5.4.8 issue#I23ORQ@Gitee
// 千位分隔符去掉 // 千位分隔符去掉
int v1 = NumberUtil.parseNumber("1,482.00").intValue(); final int v1 = NumberUtil.parseNumber("1,482.00").intValue();
Assert.assertEquals(1482, v1); Assert.assertEquals(1482, v1);
Number v2 = NumberUtil.parseNumber("1,482.00D"); final Number v2 = NumberUtil.parseNumber("1,482.00D");
Assert.assertEquals(1482L, v2.longValue()); Assert.assertEquals(1482L, v2.longValue());
} }
@Test
public void parseNumberTest2(){
// issue#I5M55F
final String numberStr = "429900013E20220812163344551";
final Number number = NumberUtil.parseNumber(numberStr);
Assert.assertNotNull(number);
Assert.assertTrue(number instanceof BigDecimal);
}
@Test @Test
public void parseHexNumberTest() { public void parseHexNumberTest() {
// 千位分隔符去掉 // 千位分隔符去掉
@ -421,7 +438,7 @@ public class NumberUtilTest {
@Test @Test
public void toPlainNumberTest(){ public void toPlainNumberTest(){
String num = "5344.34234e3"; final String num = "5344.34234e3";
final String s = new BigDecimal(num).toPlainString(); final String s = new BigDecimal(num).toPlainString();
Assert.assertEquals("5344342.34", s); Assert.assertEquals("5344342.34", s);
} }
@ -434,7 +451,7 @@ public class NumberUtilTest {
@Test @Test
public void isOddOrEvenTest(){ public void isOddOrEvenTest(){
int[] a = { 0, 32, -32, 123, -123 }; final int[] a = { 0, 32, -32, 123, -123 };
Assert.assertFalse(NumberUtil.isOdd(a[0])); Assert.assertFalse(NumberUtil.isOdd(a[0]));
Assert.assertTrue(NumberUtil.isEven(a[0])); Assert.assertTrue(NumberUtil.isEven(a[0]));