java实现人民币大小写转换方法分享


下面是一个Java实现的简单示例,用于将人民币金额(假设为整数或保留两位小数的浮点数)转换成中文大写形式。请注意,这个示例仅处理基本的转换逻辑,并未涵盖所有可能的边界情况或特殊规则(如连续零的处理等)。


public class RMBConversion {

    private static final String[] CN_NUMBERS = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
    private static final String[] CN_UNITS = {"", "拾", "佰", "仟"};
    private static final String[] CN_BIG_UNITS = {"", "万", "亿", "兆"};

    public static String convertToChinese(double money) {
        if (money < 0) {
            return "金额不能为负";
        }

        long yuan = Math.round(money * 100); // 转换为分为单位
        String numStr = String.format("%014d", yuan); // 补齐到14位,方便处理

        StringBuilder result = new StringBuilder();
        int sectionIndex = 0;

        for (int i = 0; i < numStr.length(); i += 4) {
            String section = numStr.substring(i, Math.min(i + 4, numStr.length()));
            String part = convertSection(section);
            if (!part.isEmpty()) {
                result.append(part).append(CN_BIG_UNITS[sectionIndex]).append(" ");
            } else if (!result.toString().isEmpty() && !"零".equals(result.toString().trim())) {
                // 避免连续的零或开头的零
                result.append("零 ").append(CN_BIG_UNITS[sectionIndex]).append(" ");
            }
            sectionIndex++;
        }

        return result.toString().trim();
    }

    private static String convertSection(String section) {
        if ("0000".equals(section)) {
            return "";
        }

        StringBuilder part = new StringBuilder();
        boolean zero = false;

        for (int j = 0; j < section.length(); j++) {
            int num = section.charAt(j) - '0';
            String chineseNum = CN_NUMBERS[num];
            String unit = CN_UNITS[j];

            if (num == 0) {
                zero = true;
                if (j == 0 && section.length() > 1) {
                    // 每节的开头是0,保留
                    part.append(chineseNum).append(unit);
                }
            } else {
                if (zero && part.length() > 0 && !"零".equals(part.toString().trim())) {
                    // 非开头位置且前面有0,需要添加'零'
                    part.append("零").append(chineseNum).append(unit);
                } else {
                    part.append(chineseNum).append(unit);
                }
                zero = false;
            }
        }

        return part.toString().replaceAll("零+$", "").trim(); // 移除末尾的零
    }

    public static void main(String[] args) {
        System.out.println(convertToChinese(12345678.9)); // 示例输出
    }
}

请注意,上述代码主要关注于基本的转换逻辑,并未完全遵循人民币大写金额的所有复杂规则(比如连续零的处理、整数的特殊处理等)。在实际应用中,您可能需要根据具体需求进一步调整和完善代码。