diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/NumberChineseFormatter.java b/hutool-core/src/main/java/cn/hutool/core/convert/NumberChineseFormatter.java index 71fd6fa1d..c9a45d90c 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/NumberChineseFormatter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/NumberChineseFormatter.java @@ -2,11 +2,15 @@ package cn.hutool.core.convert; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; import java.math.BigDecimal; import java.math.RoundingMode; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * 数字转中文类
@@ -43,6 +47,18 @@ public class NumberChineseFormatter { new ChineseUnit('亿', 1_0000_0000, true), }; + /** + * 口语化映射 + */ + private static final Map COLLOQUIAL_WORDS = new HashMap() { + { + put("一十", "十"); + put("一拾", "拾"); + put("负一十", "负十"); + put("负一拾", "负拾"); + } + }; + /** * 阿拉伯数字转换成中文,小数点后四舍五入保留两位. 使用于整数、小数的转换. * @@ -220,6 +236,39 @@ public class NumberChineseFormatter { return chinese; } + /** + * 阿拉伯数字转换成中文. 使用于整数、小数的转换. + * 支持多位小数 + * + * @param amount 数字 + * @param isUseTraditional 是否使用繁体 + * @param isUseColloquial 是否使用口语化(e.g. 一十 -> 十) + * @return 中文 + */ + public static String format(BigDecimal amount, boolean isUseTraditional, boolean isUseColloquial) { + String formatAmount; + if (amount.scale() <= 0) { + formatAmount = NumberChineseFormatter.format(amount.longValue(), isUseTraditional); + } else { + List numberList = StrUtil.split(amount.toPlainString(), CharUtil.DOT); + // 小数部分逐个数字转换为汉字 + StringBuilder decimalPartStr = new StringBuilder(); + for (char decimalChar : numberList.get(1).toCharArray()) { + decimalPartStr.append(NumberChineseFormatter.numberCharToChinese(decimalChar, isUseTraditional)); + } + formatAmount = NumberChineseFormatter.format(amount.longValue(), isUseTraditional) + "点" + decimalPartStr; + } + if (isUseColloquial) { + for (Map.Entry colloquialWord : COLLOQUIAL_WORDS.entrySet()) { + if (formatAmount.startsWith(colloquialWord.getKey())) { + formatAmount = formatAmount.replaceFirst(colloquialWord.getKey(), colloquialWord.getValue()); + break; + } + } + } + return formatAmount; + } + /** * 数字字符转中文,非数字字符原样返回 *