演算法思路
- 按四位一組分割(符合中文讀數習慣:個/萬/億)
- 處理每組四位數:千/百/十/個位對應中文數字與單位
- 處理零的讀法:組內連續零只讀一個「零」,組間需補「零」
- 組合各組結果,加上「萬」「億」單位
核心程式碼
public class NumberUtil {
private static final String[] NUM1 = {"零","壹","貳","叁","肆","伍","陸","柒","捌","玖"};
private static final String[] NUM2 = {"零","拾","佰","仟","萬","億"};
public static String getNumberStr(int num) {
if (num < 0) return "";
if (num == 0) return NUM1[0];
int split = 10000;
int yi = num / (split * split); // 億
int wan = (num / split) % split; // 萬
int ge = num % split; // 萬以下
StringBuilder sb = new StringBuilder();
// 億
if (yi > 0) { sb.append(getSection(yi)).append(NUM2[5]); }
// 萬
if (wan > 999) { sb.append(getSection(wan)).append(NUM2[4]); }
else if (wan > 0) {
if (yi > 0) sb.append(NUM2[0]);
sb.append(getSection(wan)).append(NUM2[4]);
}
// 萬以下
if (ge > 0) {
if (wan > 0) {
if (ge > 999) sb.append(getSection(ge));
else { sb.append(NUM2[0]).append(getSection(ge)); }
} else if (yi > 0) {
sb.append(NUM2[0]).append(getSection(ge));
} else {
sb.append(getSection(ge));
}
}
return sb.toString();
}
private static String getSection(int num) { // 0~9999
if (num < 0 || num > 9999) return "";
int q = num / 1000;
int b = (num / 100) % 10;
int s = (num / 10) % 10;
int g = num % 10;
StringBuilder sb = new StringBuilder();
if (q > 0) { sb.append(NUM1[q]).append(NUM2[3]); }
if (b > 0) { sb.append(NUM1[b]).append(NUM2[2]); }
else if (q > 0) sb.append(NUM2[0]);
if (s > 0) { sb.append(NUM1[s]).append(NUM2[1]); }
else if (b > 0) sb.append(NUM2[0]);
if (g > 0) sb.append(NUM1[g]);
return sb.toString();
}
public static void main(String[] args) {
int[] tests = {1, 1001, 100101, 10100101, 1234567890};
for (int n : tests) System.out.println(n + " -> " + getNumberStr(n));
}
}
執行結果
1 -> 壹
1001 -> 壹仟零壹
100101 -> 壹拾萬零壹佰零壹
10100101 -> 壹仟零壹拾萬零壹佰零壹
1234567890 -> 壹拾貳億叁仟肆佰伍拾陸萬柒仟捌佰玖拾