luo
2023-09-25 35fec86ca49916eb8a8082f7f1e99185ee1e3c24
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
package com.dsh.guns.modular.system.util;
 
import java.math.BigDecimal;
 
public class BigDecimalToChineseAmountUtil {
    private static final String[] CN_UPPER_NUMBER = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
    private static final String[] CN_UPPER_MONETRAY_UNIT = {"分", "角", "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾", "佰", "仟"};
    private static final String CN_FULL = "整";
    private static final String CN_NEGATIVE = "负";
    private static final int MONEY_PRECISION = 2;
 
    public static String convertToChineseAmount(BigDecimal number) {
        StringBuilder builder = new StringBuilder();
 
        if (number.compareTo(BigDecimal.ZERO) < 0) {
            builder.append(CN_NEGATIVE);
            number = number.abs();
        }
 
        long integralPart = number.longValue();
        BigDecimal decimalPart = number.subtract(BigDecimal.valueOf(integralPart)).multiply(BigDecimal.TEN.pow(MONEY_PRECISION));
 
        if (decimalPart.compareTo(BigDecimal.ZERO) == 0) {
            builder.append(CN_FULL);
        }
 
        long integralPartTemp = integralPart;
        int unit = 0;
        boolean isZero = true;
        boolean needZero = false;
 
        while (integralPartTemp > 0) {
            long tempNumber = integralPartTemp % 10;
            if (tempNumber > 0) {
                if (needZero) {
                    builder.insert(0, CN_UPPER_NUMBER[0]);
                }
                builder.insert(0, CN_UPPER_MONETRAY_UNIT[unit]);
                builder.insert(0, CN_UPPER_NUMBER[(int) tempNumber]);
                isZero = false;
                needZero = false;
            } else {
                if (!isZero) {
                    needZero = true;
                }
                if (unit == 2 || unit == 6 || unit == 10 || unit == 14) {
                    builder.insert(0, CN_UPPER_MONETRAY_UNIT[unit]);
                    isZero = true;
                }
            }
            integralPartTemp = integralPartTemp / 10;
            unit++;
        }
 
        if (decimalPart.compareTo(BigDecimal.ZERO) > 0) {
            builder.append(convertDecimalToChinese(decimalPart));
        }
 
        return builder.toString();
    }
 
    private static String convertDecimalToChinese(BigDecimal decimalPart) {
        StringBuilder builder = new StringBuilder();
 
        for (int i = 0; i < MONEY_PRECISION; i++) {
            int num = decimalPart.intValue() % 10;
            builder.insert(0, CN_UPPER_NUMBER[num]);
            builder.append(CN_UPPER_MONETRAY_UNIT[i + 2]);
            decimalPart = decimalPart.multiply(BigDecimal.TEN);
        }
 
        return builder.toString();
    }
 
    public static void main(String[] args) {
        BigDecimal number = new BigDecimal("12345.67");
        String chineseAmount = convertToChineseAmount(number);
        System.out.println(chineseAmount); // Output: 壹万贰仟叁佰肆拾伍元陆角柒分
    }
}