Java实现中文金额转换

概述

  • 话不多说,直接上代码

代码

/**
 * @Author: hweiyu
 * @Description: TODO
 * @Date: 2025/5/23 11:33
 */
import java.math.BigDecimal;
import java.util.Scanner;

public class AmountToChinese {

    // 中文数字字符
    private static final String[] NUMBERS = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
    // 单位
    private static final String[] UNITS = {"", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟"};
    // 小数部分单位
    private static final String[] DECIMAL_UNITS = {"角", "分"};

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入金额(支持两位小数):");
        String amountStr = scanner.nextLine();
        scanner.close();

        try {
            String chineseAmount = convertToChinese(amountStr);
            System.out.println("中文大写:" + chineseAmount);
        } catch (IllegalArgumentException e) {
            System.out.println("输入错误:" + e.getMessage());
        }
    }

    public static String convertToChinese(String amountStr) {
        // 检查输入是否为空
        if (amountStr == null || amountStr.trim().isEmpty()) {
            throw new IllegalArgumentException("金额不能为空");
        }

        // 移除所有空格
        amountStr = amountStr.trim().replaceAll("\\s+", "");

        // 验证金额格式
        if (!amountStr.matches("^\\d+(\\.\\d{1,2})?$")) {
            throw new IllegalArgumentException("金额格式不正确,最多支持两位小数");
        }

        // 处理零元的情况
        if (amountStr.equals("0") || amountStr.equals("0.0") || amountStr.equals("0.00")) {
            return "零元整";
        }

        // 分割整数和小数部分
        String[] parts = amountStr.split("\\.");
        String integerPart = parts[0];
        String decimalPart = parts.length > 1 ? parts[1] : "";

        // 处理小数部分(补齐两位)
        if (decimalPart.length() == 1) {
            decimalPart += "0";
        } else if (decimalPart.length() > 2) {
            decimalPart = decimalPart.substring(0, 2);
        }

        StringBuilder result = new StringBuilder();

        // 处理整数部分
        if (!integerPart.equals("0")) {
            result.append(convertIntegerPart(integerPart));
            result.append("元");
        }

        // 处理小数部分
        if (!decimalPart.isEmpty() && !decimalPart.equals("00")) {
            result.append(convertDecimalPart(decimalPart));
        } else {
            result.append("整");
        }

        return result.toString();
    }

    private static String convertIntegerPart(String integerPart) {
        StringBuilder result = new StringBuilder();
        int length = integerPart.length();

        for (int i = 0; i < length; i++) {
            int digit = integerPart.charAt(i) - '0';
            int position = length - i - 1;

            // 处理零的情况
            if (digit == 0) {
                // 当前位为零,且下一位不为零,添加"零"
                if (i < length - 1 && integerPart.charAt(i + 1) != '0' &&
                        !result.toString().endsWith("零")) {
                    result.append("零");
                }
                // 处理万亿、亿、万的单位
                if (position % 4 == 0) {
                    result.append(UNITS[position]);
                }
            } else {
                result.append(NUMBERS[digit]);
                result.append(UNITS[position]);
            }
        }

        // 处理特殊情况,如"壹拾"简化为"拾"
        String resultStr = result.toString();
        if (resultStr.startsWith("壹拾") && resultStr.length() > 2) {
            resultStr = resultStr.substring(1);
        }

        return resultStr;
    }

    private static String convertDecimalPart(String decimalPart) {
        StringBuilder result = new StringBuilder();
        int jiao = decimalPart.charAt(0) - '0';
        int fen = decimalPart.charAt(1) - '0';

        if (jiao != 0) {
            result.append(NUMBERS[jiao]).append(DECIMAL_UNITS[0]);
        }

        if (fen != 0) {
            // 如果角为零,分不为零,需要添加"零"
            if (jiao == 0) {
                result.append("零");
            }
            result.append(NUMBERS[fen]).append(DECIMAL_UNITS[1]);
        }

        return result.toString();
    }
}

你可能感兴趣的:(技术栈杂谈,java,开发语言)