mirror of
https://gitee.com/dromara/hutool.git
synced 2025-04-05 17:37:59 +08:00
NumberUtil.parseInt忽略科学计数法
This commit is contained in:
parent
e6b89806f4
commit
2f66008d02
@ -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)
|
||||||
|
@ -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);
|
||||||
|
@ -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]));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user