diff --git a/hutool-core/src/main/java/cn/hutool/core/math/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/math/NumberUtil.java
index a75d304c1..ec978d8da 100644
--- a/hutool-core/src/main/java/cn/hutool/core/math/NumberUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/math/NumberUtil.java
@@ -25,6 +25,7 @@ import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Collection;
+import java.util.Locale;
/**
* 数字工具类
@@ -82,7 +83,13 @@ public class NumberUtil {
/**
* 提供精确的加法运算
- * 如果传入多个值为null或者空,则返回0
+ * 如果传入多个值为null或者空,则返回
+ *
+ *
+ * 需要注意的是,在不同Locale下,数字的表示形式也是不同的,例如:
+ * 德国、荷兰、比利时、丹麦、意大利、罗马尼亚和欧洲大多地区使用`,`区分小数
+ * 也就是说,在这些国家地区,1.20表示120,而非1.2。
+ *
*
* @param values 多个被加值
* @return 和
@@ -1684,19 +1691,44 @@ public class NumberUtil {
* 将指定字符串转换为{@link Number} 对象
* 此方法不支持科学计数法
*
+ *
+ * 需要注意的是,在不同Locale下,数字的表示形式也是不同的,例如:
+ * 德国、荷兰、比利时、丹麦、意大利、罗马尼亚和欧洲大多地区使用`,`区分小数
+ * 也就是说,在这些国家地区,1.20表示120,而非1.2。
+ *
+ *
* @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} 对象
+ * 此方法不支持科学计数法
+ *
+ *
+ * 需要注意的是,在不同Locale下,数字的表示形式也是不同的,例如:
+ * 德国、荷兰、比利时、丹麦、意大利、罗马尼亚和欧洲大多地区使用`,`区分小数
+ * 也就是说,在这些国家地区,1.20表示120,而非1.2。
+ *
+ *
+ * @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接收
diff --git a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java
index d5d782c48..7aece89f2 100644
--- a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java
@@ -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));
}