This commit is contained in:
Looly 2023-03-30 12:04:06 +08:00
parent c4548e425d
commit 4c3144079f
2 changed files with 39 additions and 7 deletions

View File

@ -25,6 +25,7 @@ import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Collection;
import java.util.Locale;
/**
* 数字工具类<br>
@ -82,7 +83,13 @@ public class NumberUtil {
/**
* 提供精确的加法运算<br>
* 如果传入多个值为null或者空则返回0
* 如果传入多个值为null或者空则返回
*
* <p>
* 需要注意的是在不同Locale下数字的表示形式也是不同的例如<br>
* 德国荷兰比利时丹麦意大利罗马尼亚和欧洲大多地区使用`,`区分小数<br>
* 也就是说在这些国家地区1.20表示120而非1.2
* </p>
*
* @param values 多个被加值
* @return
@ -1684,19 +1691,44 @@ public class NumberUtil {
* 将指定字符串转换为{@link Number} 对象<br>
* 此方法不支持科学计数法
*
* <p>
* 需要注意的是在不同Locale下数字的表示形式也是不同的例如<br>
* 德国荷兰比利时丹麦意大利罗马尼亚和欧洲大多地区使用`,`区分小数<br>
* 也就是说在这些国家地区1.20表示120而非1.2
* </p>
*
* @param numberStr Number字符串
* @return Number对象
* @throws NumberFormatException 包装了{@link ParseException}当给定的数字字符串无法解析时抛出
* @since 4.1.15
*/
public static Number parseNumber(final String numberStr) throws NumberFormatException {
return parseNumber(numberStr, Locale.getDefault(Locale.Category.FORMAT));
}
/**
* 将指定字符串转换为{@link Number} 对象<br>
* 此方法不支持科学计数法
*
* <p>
* 需要注意的是在不同Locale下数字的表示形式也是不同的例如<br>
* 德国荷兰比利时丹麦意大利罗马尼亚和欧洲大多地区使用`,`区分小数<br>
* 也就是说在这些国家地区1.20表示120而非1.2
* </p>
*
* @param numberStr Number字符串
* @param locale 地区不同地区数字表示方式不同
* @return Number对象
* @throws NumberFormatException 包装了{@link ParseException}当给定的数字字符串无法解析时抛出
*/
public static Number parseNumber(final String numberStr, final Locale locale) throws NumberFormatException {
if (StrUtil.startWithIgnoreCase(numberStr, "0x")) {
// 0x04表示16进制数
return Long.parseLong(numberStr.substring(2), 16);
}
try {
final NumberFormat format = NumberFormat.getInstance();
final NumberFormat format = NumberFormat.getInstance(locale);
if (format instanceof DecimalFormat) {
// issue#1818@Github
// 当字符串数字超出double的长度时会导致截断此处使用BigDecimal接收

View File

@ -459,11 +459,11 @@ public class NumberUtilTest {
// -------------------------- Parse failed -----------------------
assertThat(NumberUtil.parseNumber("abc", null), nullValue());
assertThat(NumberUtil.parseNumber("abc", (Number) null), nullValue());
assertThat(NumberUtil.parseNumber(StrUtil.EMPTY, null), nullValue());
assertThat(NumberUtil.parseNumber(StrUtil.EMPTY, (Number) null), nullValue());
assertThat(NumberUtil.parseNumber(StrUtil.repeat(StrUtil.SPACE, 10), null), nullValue());
assertThat(NumberUtil.parseNumber(StrUtil.repeat(StrUtil.SPACE, 10), (Number) null), nullValue());
assertThat(NumberUtil.parseNumber("abc", 456).intValue(), equalTo(456));
@ -471,9 +471,9 @@ public class NumberUtilTest {
assertThat(NumberUtil.parseNumber("123.abc", 789).intValue(), equalTo(123));
assertThat(NumberUtil.parseNumber("123.3", null).doubleValue(), equalTo(123.3D));
assertThat(NumberUtil.parseNumber("123.3", (Number) null).doubleValue(), equalTo(123.3D));
assertThat(NumberUtil.parseNumber("0.123.3", null).doubleValue(), equalTo(0.123D));
assertThat(NumberUtil.parseNumber("0.123.3", (Number) null).doubleValue(), equalTo(0.123D));
}