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)); // 输出: 壹佰元整 } }