mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
fix bug
This commit is contained in:
parent
47f1d967ed
commit
a1ee4d27c3
@ -2154,18 +2154,28 @@ public class NumberUtil {
|
|||||||
* 数字转{@link BigDecimal}<br>
|
* 数字转{@link BigDecimal}<br>
|
||||||
* null或""或空白符转换为0
|
* null或""或空白符转换为0
|
||||||
*
|
*
|
||||||
* @param number 数字字符串
|
* @param numberStr 数字字符串
|
||||||
* @return {@link BigDecimal}
|
* @return {@link BigDecimal}
|
||||||
* @since 4.0.9
|
* @since 4.0.9
|
||||||
*/
|
*/
|
||||||
public static BigDecimal toBigDecimal(String number) {
|
public static BigDecimal toBigDecimal(String numberStr) {
|
||||||
|
if(StrUtil.isBlank(numberStr)){
|
||||||
|
return BigDecimal.ZERO;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
number = parseNumber(number).toString();
|
// 支持类似于 1,234.55 格式的数字
|
||||||
|
final Number number = parseNumber(numberStr);
|
||||||
|
if(number instanceof BigDecimal){
|
||||||
|
return (BigDecimal) number;
|
||||||
|
} else {
|
||||||
|
return new BigDecimal(number.toString());
|
||||||
|
}
|
||||||
} catch (Exception ignore) {
|
} catch (Exception ignore) {
|
||||||
// 忽略解析错误
|
// 忽略解析错误
|
||||||
}
|
}
|
||||||
return StrUtil.isBlank(number) ? BigDecimal.ZERO : new
|
|
||||||
BigDecimal(number);
|
return new BigDecimal(numberStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2500,7 +2510,13 @@ public class NumberUtil {
|
|||||||
*/
|
*/
|
||||||
public static Number parseNumber(String numberStr) throws NumberFormatException {
|
public static Number parseNumber(String numberStr) throws NumberFormatException {
|
||||||
try {
|
try {
|
||||||
return NumberFormat.getInstance().parse(numberStr);
|
final NumberFormat format = NumberFormat.getInstance();
|
||||||
|
if(format instanceof DecimalFormat){
|
||||||
|
// issue#1818@Github
|
||||||
|
// 当字符串数字超出double的长度时,会导致截断,此处使用BigDecimal接收
|
||||||
|
((DecimalFormat) format).setParseBigDecimal(true);
|
||||||
|
}
|
||||||
|
return format.parse(numberStr);
|
||||||
} catch (ParseException e) {
|
} catch (ParseException e) {
|
||||||
final NumberFormatException nfe = new NumberFormatException(e.getMessage());
|
final NumberFormatException nfe = new NumberFormatException(e.getMessage());
|
||||||
nfe.initCause(e);
|
nfe.initCause(e);
|
||||||
|
@ -13,6 +13,7 @@ import org.junit.Assert;
|
|||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.math.BigDecimal;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@ -334,4 +335,12 @@ public class ConvertTest {
|
|||||||
Assert.assertEquals("v2", hashtable.get("a2"));
|
Assert.assertEquals("v2", hashtable.get("a2"));
|
||||||
Assert.assertEquals("v3", hashtable.get("a3"));
|
Assert.assertEquals("v3", hashtable.get("a3"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void toBigDecimalTest(){
|
||||||
|
// https://github.com/dromara/hutool/issues/1818
|
||||||
|
String str = "33020000210909112800000124";
|
||||||
|
final BigDecimal bigDecimal = Convert.toBigDecimal(str);
|
||||||
|
Assert.assertEquals(str, bigDecimal.toPlainString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -283,7 +283,7 @@ public class NumberUtilTest {
|
|||||||
Assert.assertEquals(1482, v1);
|
Assert.assertEquals(1482, v1);
|
||||||
|
|
||||||
Number v2 = NumberUtil.parseNumber("1,482.00D");
|
Number v2 = NumberUtil.parseNumber("1,482.00D");
|
||||||
Assert.assertEquals(1482L, v2);
|
Assert.assertEquals(1482L, v2.longValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
Loading…
x
Reference in New Issue
Block a user