public class FigureAndChinese2Util {
private static final Map<Character, Character> DIGIT_MAP = Map.of(
'0','零','1','壹','2','貳','3','叁','4','肆',
'5','伍','6','陸','7','柒','8','捌','9','玖'
);
private static final char[] UNIT = {'拾','佰','仟'};
public static void main(String[] args) {
test("4444444441.23");
test("1");
test("1000000000.01");
test("101010002.11");
}
static void test(String s) { m(s); }
// 入口
static void m(String num) {
StringBuffer sb = new StringBuffer();
String[] parts = num.split("\\.");
if (parts.length == 2) {
processInteger(parts[0], 0, sb);
sb.append(processDecimal(parts[1]));
} else {
processInteger(num, 0, sb);
}
sb.append("整");
System.out.println(sb);
}
// 整數部分遞歸:每 4 位一組 (個、萬、億)
static void processInteger(String s, int group, StringBuffer sb) {
int len = s.length();
if (len >= 4) {
processInteger(s.substring(0, len - 4), group + 1, sb);
sb.insert(0, processGroup(s.substring(len - 4), group));
} else if (len > 0) {
sb.insert(0, processGroup(s, group));
}
// 去除最高位多餘零
if (sb.length() > 0 && sb.charAt(0) == '零') sb.deleteCharAt(0);
}
// 處理 4 位一組:加單位 (萬/億) + 位內單位 (拾/佰/仟) + 數字
static StringBuffer processGroup(String four, int group) {
StringBuffer g = new StringBuffer(four);
switch (group) {
case 0: g.append("圓"); break;
case 1: g.append("萬"); break;
case 2: g.append("億"); break;
}
// 數字轉中文 + 位內單位
for (int i = g.length() - 2, u = 0; i >= 0; i--, u++) {
char d = g.charAt(i);
g.setCharAt(i, DIGIT_MAP.get(d));
if (i != 0) g.insert(i, UNIT[u]);
}
// 零簡化邏輯
return simplifyZero(g);
}
// 零簡化:連續零合併、單位位零刪除、單位字符保留
static StringBuffer simplifyZero(StringBuffer g) {
for (int i = 0; i < g.length(); i++) {
if (g.charAt(i) == '零') {
char next = (i + 1 < g.length()) ? g.charAt(i + 1) : 0;
if (next != '圓' && next != '萬' && next != '億') {
g.deleteCharAt(i + 1); // 刪除單位
} else {
g.deleteCharAt(i); // 刪除零本身
}
// 合併連續零
if (i > 0 && g.charAt(i - 1) == '零') {
g.deleteCharAt(i - 1);
i--;
}
}
}
// 單位組只有「圓/萬/億」則整組刪除
if (g.length() == 1 && "圓萬億".indexOf(g.charAt(0)) >= 0) g.setLength(0);
return g;
}
// 小數部分:角、分
static StringBuffer processDecimal(String dec) {
if (dec.length() > 2) dec = dec.substring(0, 2);
dec = dec.replaceFirst("00$", "");
StringBuffer d = new StringBuffer(dec);
if (d.length() == 0) return d;
if (d.charAt(d.length() - 1) == '0') d.deleteCharAt(d.length() - 1);
d.setCharAt(0, DIGIT_MAP.get(d.charAt(0)));
switch (d.length()) {
case 1: d.append("角"); break;
case 2:
d.setCharAt(1, DIGIT_MAP.get(d.charAt(1)));
if (d.charAt(0) != '零') d.insert(1, '角');
d.append("分");
break;
}
return d;
}
}
4444444441.23 → 肆拾肆億肆仟肆佰肆拾肆萬肆仟肆佰肆拾壹圓貳角叁分整 1 → 壹圓整 1000000000.01 → 壹拾億圓零壹分整 101010002.11 → 壹億零壹佰零壹萬圓壹角壹分整
可直接集成至銀行、ERP、報銷系統的金額轉換模塊。