luofl
2025-04-11 c5990f66b61e124ee678cbb60699d1135c965ce3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package com.ruoyi.web.controller.tool;
 
public class NumberToChineseUtils {
 
    // 中文数字字符
    private static final char[] CHINESE_NUMBERS = {'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'};
    // 单位字符
    private static final String[] UNITS = {"", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿"};
 
    /**
     * 数字转大写中文
     *
     * @param num 需要转换的数字
     * @return 转换后的大写中文字符串
     */
    public static String numberToChinese(long num) {
        if (num == 0) {
            return "零";
        }
 
        StringBuilder result = new StringBuilder();
        String numStr = String.valueOf(num);
        int unitIndex = 0; // 单位索引
        boolean zeroFlag = false; // 标记上一个字符是否为0
 
        for (int i = numStr.length() - 1; i >= 0; i--) {
            int digit = numStr.charAt(i) - '0';
            String part = toChinesePart(digit, unitIndex, zeroFlag);
            result.insert(0, part);
 
            // 更新上一个字符是否为零的标记
            zeroFlag = digit == 0;
 
            // 更新单位索引
            if (unitIndex == 4 || unitIndex == 8) {
                unitIndex = 1; // 万和亿后单位重置
            } else {
                unitIndex++;
            }
        }
 
        // 去除结果字符串末尾的'零'
        while (result.length() > 1 && result.charAt(result.length() - 1) == '零') {
            result.deleteCharAt(result.length() - 1);
        }
 
        return result.toString();
    }
 
    /**
     * 转换数字部分并添加单位
     *
     * @param digit     当前数字
     * @param unitIndex 单位索引
     * @param zeroFlag  上一个字符是否为零
     * @return 转换后的字符串
     */
    private static String toChinesePart(int digit, int unitIndex, boolean zeroFlag) {
        if (digit == 0) {
            return zeroFlag ? "" : "零";
        }
 
        String part = CHINESE_NUMBERS[digit] + UNITS[unitIndex];
 
        // 连续两个'零'只保留一个
        if (part.equals("零零") || part.equals("零拾")) {
            return "零";
        }
 
        // 去除'零拾'、'零佰'、'零仟'
        if (part.startsWith("零")) {
            part = part.substring(1);
        }
 
        return part;
    }
 
    /**
     * 数字转大写中文(支持小数)
     *
     * @param number 需要转换的数字
     * @return 转换后的大写中文字符串
     */
    public static String numberToChinese(double number) {
        if (number == 0) {
            return "零";
        }
 
        StringBuilder result = new StringBuilder();
        String numStr = String.format("%.2f", number); // 保留两位小数
        String[] parts = numStr.split("\\.");
 
        // 整数部分
        if (!parts[0].equals("0")) {
            result.append(numberToChinese(Long.parseLong(parts[0])));
        }
 
        // 小数部分
        if (parts.length > 1) {
            String decimalPart = parts[1];
            if (!decimalPart.equals("00")) {
                result.append("元");
                if (decimalPart.charAt(0) != '0') {
                    result.append(CHINESE_NUMBERS[decimalPart.charAt(0) - '0']).append("角");
                }
                if (decimalPart.charAt(1) != '0') {
                    result.append(CHINESE_NUMBERS[decimalPart.charAt(1) - '0']).append("分");
                }
            } else {
                result.append("元整");
            }
        } else {
            result.append("元整");
        }
 
        return result.toString();
    }
 
    public static void main(String[] args) {
        System.out.println(numberToChinese(123456)); // 输出: 壹拾贰万叁仟肆佰伍拾陆元整
        System.out.println(numberToChinese(10010));  // 输出: 壹万零壹拾元整
        System.out.println(numberToChinese(100000001)); // 输出: 壹亿零壹元整
        System.out.println(numberToChinese(68435)); // 输出: 陆万捌仟肆佰叁拾伍元整
        System.out.println(numberToChinese(24000)); // 输出: 捌仟伍佰肆拾叁元整
        System.out.println(numberToChinese(123.45)); // 输出: 壹佰贰拾叁元肆角伍分
        System.out.println(numberToChinese(0.67));   // 输出: 零元陆角柒分
        System.out.println(numberToChinese(100.00)); // 输出: 壹佰元整
    }
}