修复NumberWordFormatter.format小数问题

This commit is contained in:
Looly 2024-05-11 11:57:25 +08:00
parent 5556f74688
commit 8e62f5ce44
3 changed files with 70 additions and 13 deletions

View File

@ -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)

View File

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

View File

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