mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
修复NumberWordFormatter.format小数问题
This commit is contained in:
parent
5556f74688
commit
8e62f5ce44
@ -2,7 +2,7 @@
|
|||||||
# 🚀Changelog
|
# 🚀Changelog
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------
|
||||||
# 5.8.28(2024-05-10)
|
# 5.8.28(2024-05-11)
|
||||||
|
|
||||||
### 🐣新特性
|
### 🐣新特性
|
||||||
* 【core 】 修正XmlUtil的omitXmlDeclaration描述注释(issue#I9CPC7@Gitee)
|
* 【core 】 修正XmlUtil的omitXmlDeclaration描述注释(issue#I9CPC7@Gitee)
|
||||||
@ -36,6 +36,7 @@
|
|||||||
* 【db 】 修复Oracle下特殊表名导致meta信息获取不到问题(issue#I9BANE@Gitee)
|
* 【db 】 修复Oracle下特殊表名导致meta信息获取不到问题(issue#I9BANE@Gitee)
|
||||||
* 【db 】 修复FuncComparator.thenComparing不生效问题(issue#3569@Github)
|
* 【db 】 修复FuncComparator.thenComparing不生效问题(issue#3569@Github)
|
||||||
* 【core 】 修复EnumUtil空指针问题(issue#I9NSZ4@Gitee)
|
* 【core 】 修复EnumUtil空指针问题(issue#I9NSZ4@Gitee)
|
||||||
|
* 【core 】 修复NumberWordFormatter.format小数问题(issue#3579@Github)
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------
|
||||||
# 5.8.27(2024-03-29)
|
# 5.8.27(2024-03-29)
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package cn.hutool.core.convert;
|
package cn.hutool.core.convert;
|
||||||
|
|
||||||
|
import cn.hutool.core.lang.Console;
|
||||||
import cn.hutool.core.util.NumberUtil;
|
import cn.hutool.core.util.NumberUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
|
||||||
@ -121,16 +122,12 @@ public class NumberWordFormatter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String xs = ""; // 用来存放转换后小数部分
|
String xs = lm.length() == 0 ? "ZERO " : " "; // 用来存放转换后小数部分
|
||||||
if (z > -1) {
|
if (z > -1) {
|
||||||
xs = "AND CENTS " + transTwo(rstr) + " "; // 小数部分存在时转换小数
|
xs += "AND CENTS " + transTwo(rstr) + " "; // 小数部分存在时转换小数
|
||||||
}
|
}
|
||||||
|
|
||||||
return lm.toString().trim() + " " + xs + "ONLY";
|
return lm.toString().trim() + xs + "ONLY";
|
||||||
}
|
|
||||||
|
|
||||||
private static String parseFirst(String s) {
|
|
||||||
return NUMBER[Integer.parseInt(s.substring(s.length() - 1))];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String parseTeen(String s) {
|
private static String parseTeen(String s) {
|
||||||
@ -152,17 +149,17 @@ public class NumberWordFormatter {
|
|||||||
if (s.length() > 2) {
|
if (s.length() > 2) {
|
||||||
s = s.substring(0, 2);
|
s = s.substring(0, 2);
|
||||||
} else if (s.length() < 2) {
|
} else if (s.length() < 2) {
|
||||||
s = "0" + s;
|
s = s + "0";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s.startsWith("0")) {// 07 - seven 是否小於10
|
if (s.startsWith("0")) {// 07 - seven 是否小於10
|
||||||
value = parseFirst(s);
|
value = parseLast(s);
|
||||||
} else if (s.startsWith("1")) {// 17 seventeen 是否在10和20之间
|
} else if (s.startsWith("1")) {// 17 seventeen 是否在10和20之间
|
||||||
value = parseTeen(s);
|
value = parseTeen(s);
|
||||||
} else if (s.endsWith("0")) {// 是否在10与100之间的能被10整除的数
|
} else if (s.endsWith("0")) {// 是否在10与100之间的能被10整除的数
|
||||||
value = parseTen(s);
|
value = parseTen(s);
|
||||||
} else {
|
} else {
|
||||||
value = parseTen(s) + " " + parseFirst(s);
|
value = parseTen(s) + " " + parseLast(s);
|
||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
@ -174,10 +171,14 @@ public class NumberWordFormatter {
|
|||||||
if (s.startsWith("0")) {// 是否小於100
|
if (s.startsWith("0")) {// 是否小於100
|
||||||
value = transTwo(s.substring(1));
|
value = transTwo(s.substring(1));
|
||||||
} else if ("00".equals(s.substring(1))) {// 是否被100整除
|
} else if ("00".equals(s.substring(1))) {// 是否被100整除
|
||||||
value = parseFirst(s.substring(0, 1)) + " HUNDRED";
|
value = parseLast(s.substring(0, 1)) + " HUNDRED";
|
||||||
} else {
|
} 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;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String parseLast(String s) {
|
||||||
|
return NUMBER[Integer.parseInt(s.substring(s.length() - 1))];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user