首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

支票金額阿拉伯數字轉中文大寫工具類:完整處理萬/億/小數位

     編輯:Java 相關知識

需求:金融級金額轉換

  • 整數部分:按 4 位分組 (萬、億);
  • 小數部分:角、分,兩位以內;
  • 零的處理:連續零合併、單位位零不輸出、末尾補「整」。

核心代碼 (FigureAndChinese2Util)

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 → 壹億零壹佰零壹萬圓壹角壹分整

設計亮點

  1. 遞歸分組:自然對應中文「萬/億」四位一組習慣;
  2. 零語義處理:區分「中間零保留單位」與「末尾零刪除單位」;
  3. 小數截斷:超過兩位直接截斷 (不四捨五入),符合財務規範;
  4. 無第三方依賴:純 JDK 實現,打包極輕。

可直接集成至銀行、ERP、報銷系統的金額轉換模塊。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved