diff --git a/CHANGELOG.md b/CHANGELOG.md index be5288eca..c961dc5fa 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.28(2024-05-10) +# 5.8.28(2024-05-11) ### 🐣新特性 * 【core 】 修正XmlUtil的omitXmlDeclaration描述注释(issue#I9CPC7@Gitee) @@ -36,6 +36,7 @@ * 【db 】 修复Oracle下特殊表名导致meta信息获取不到问题(issue#I9BANE@Gitee) * 【db 】 修复FuncComparator.thenComparing不生效问题(issue#3569@Github) * 【core 】 修复EnumUtil空指针问题(issue#I9NSZ4@Gitee) +* 【core 】 修复NumberWordFormatter.format小数问题(issue#3579@Github) ------------------------------------------------------------------------------------------------------------- # 5.8.27(2024-03-29) diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/NumberWordFormatter.java b/hutool-core/src/main/java/cn/hutool/core/convert/NumberWordFormatter.java index 2047e52e3..d86f21eec 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/NumberWordFormatter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/NumberWordFormatter.java @@ -1,5 +1,6 @@ package cn.hutool.core.convert; +import cn.hutool.core.lang.Console; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; @@ -121,16 +122,12 @@ public class NumberWordFormatter { } } - String xs = ""; // 用来存放转换后小数部分 + String xs = lm.length() == 0 ? "ZERO " : " "; // 用来存放转换后小数部分 if (z > -1) { - xs = "AND CENTS " + transTwo(rstr) + " "; // 小数部分存在时转换小数 + xs += "AND CENTS " + transTwo(rstr) + " "; // 小数部分存在时转换小数 } - return lm.toString().trim() + " " + xs + "ONLY"; - } - - private static String parseFirst(String s) { - return NUMBER[Integer.parseInt(s.substring(s.length() - 1))]; + return lm.toString().trim() + xs + "ONLY"; } private static String parseTeen(String s) { @@ -152,17 +149,17 @@ public class NumberWordFormatter { if (s.length() > 2) { s = s.substring(0, 2); } else if (s.length() < 2) { - s = "0" + s; + s = s + "0"; } if (s.startsWith("0")) {// 07 - seven 是否小於10 - value = parseFirst(s); + value = parseLast(s); } else if (s.startsWith("1")) {// 17 seventeen 是否在10和20之间 value = parseTeen(s); } else if (s.endsWith("0")) {// 是否在10与100之间的能被10整除的数 value = parseTen(s); } else { - value = parseTen(s) + " " + parseFirst(s); + value = parseTen(s) + " " + parseLast(s); } return value; } @@ -174,10 +171,14 @@ public class NumberWordFormatter { if (s.startsWith("0")) {// 是否小於100 value = transTwo(s.substring(1)); } else if ("00".equals(s.substring(1))) {// 是否被100整除 - value = parseFirst(s.substring(0, 1)) + " HUNDRED"; + value = parseLast(s.substring(0, 1)) + " HUNDRED"; } else { - value = parseFirst(s.substring(0, 1)) + " HUNDRED AND " + transTwo(s.substring(1)); + value = parseLast(s.substring(0, 1)) + " HUNDRED AND " + transTwo(s.substring(1)); } return value; } + + private static String parseLast(String s) { + return NUMBER[Integer.parseInt(s.substring(s.length() - 1))]; + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/NumberWordFormatterTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/NumberWordFormatterTest.java new file mode 100644 index 000000000..d4c5a6740 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/convert/NumberWordFormatterTest.java @@ -0,0 +1,55 @@ +package cn.hutool.core.convert; + + +import org.junit.Assert; +import org.junit.Test; + +public class NumberWordFormatterTest { + + @Test + public void testFormatNull() { + // 测试传入null值的情况 + String result = NumberWordFormatter.format(null); + Assert.assertEquals("", result); + } + + @Test + public void testFormatInteger() { + // 测试传入整数的情况 + String result = NumberWordFormatter.format(1234); + Assert.assertEquals("ONE THOUSAND TWO HUNDRED AND THIRTY FOUR ONLY", result); + + result = NumberWordFormatter.format(1204); + Assert.assertEquals("ONE THOUSAND TWO HUNDRED AND FOUR ONLY", result); + + result = NumberWordFormatter.format(1004); + Assert.assertEquals("ONE THOUSAND FOUR ONLY", result); + } + + @Test + public void testFormatDecimal() { + // 测试传入小数的情况 + String result = NumberWordFormatter.format(1234.56); + Assert.assertEquals("ONE THOUSAND TWO HUNDRED AND THIRTY FOUR AND CENTS FIFTY SIX ONLY", result); + } + + @Test + public void testFormatLargeNumber() { + // 测试传入大数字的情况 + String result = NumberWordFormatter.format(1234567890123L); + Assert.assertEquals("ONE TRILLION TWO HUNDRED AND THIRTY FOUR BILLION FIVE HUNDRED AND SIXTY SEVEN MILLION EIGHT HUNDRED AND NINETY THOUSAND ONE HUNDRED AND TWENTY THREE ONLY", result); + } + + @Test(expected = NumberFormatException.class) + public void testFormatNonNumeric() { + // 测试传入非数字字符串的情况 + NumberWordFormatter.format("non-numeric"); + } + + @Test + public void issue3579Test() { + Assert.assertEquals("ZERO AND CENTS TEN ONLY", NumberWordFormatter.format(0.1)); + Assert.assertEquals("ZERO AND CENTS ONE ONLY", NumberWordFormatter.format(0.01)); + } +} +