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)); }