行业知识
Java将数字金额转为大写中文金额和简体中文金额
2026-10-28 07:30:43
来源:互联网转载
Java实现 “ 将数字金额转为大写中文金额 ”
()根据以上文章修改的,增加数字金额转简体中文金额,仅供参考
/** * @description 金额大写转换工具类 * @author */class AmountTransformUtils { /** * 繁体大写数字 */ private static final String[] NUMBERS = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}; /** * 繁体整数部分的单位 */ private static final String[] IUNIT = {"元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟"}; /** * 繁体小数部分的单位 */ private static final String[] DUNIT = {"角", "分"}; /** * 简体数字 */ private static final String[] CN_NUMBERS = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; /** * 简体数字单位 */ private static final String[] CN_IUNIT = {"", "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千"}; private AmountTransformUtils() { throw new IllegalStateException("Utility class"); } /** * 转换为大写的中文金额,支持负数 * @param amount 金额 * @param isSimplified 是否简体中文:true:简体,false:繁体 * @return */ public static String toChinese(String amount, boolean isSimplified) { // 判断输入的金额字符串是否符合要求 if (StringUtils.isBlank(amount) || !amount.matches("(-)?[\d]*(.)?[\d]*")) { throw new RuntimeException("请输入数字"); } if ("0".equals(amount) || "0.00".equals(amount) || "0.0".equals(amount)) { return isSimplified ? "零" : "零元"; } // 判断金额数字中是否存在负号"-" boolean flag = false; if (amount.startsWith("-")) { // 标志位,标志此金额数字为负数 flag = true; amount = amount.replaceAll("-", ""); } // 去掉金额数字中的逗号"," amount = amount.replaceAll(",", ""); // 初始化:分离整数部分和小数部分 String[] separateNum = separateNum(amount); // 整数部分数字 String integerStr = separateNum[0]; // 小数部分数字 String decimalStr = separateNum[1]; // beyond超出计算能力,直接返回 if (integerStr.length() > IUNIT.length) { throw new RuntimeException("输入数字超限"); } // 整数部分数字 int[] integers = toIntArray(integerStr); // 判断整数部分是否存在输入012的情况 if (integers.length > 1 && integers[0] == 0) { throw new RuntimeException("输入数字不符合要求"); } // 设置万单位 boolean isWan = isWan5(integerStr); // 小数部分数字 int[] decimals = toIntArray(decimalStr); // 返回最终的大写金额 String result = ""; String chineseInteger = getChineseInteger(integers, isWan, isSimplified); String chineseDecimal = getChineseDecimal(decimals, isSimplified); if (decimals.length > 0 && isSimplified) { result = chineseInteger; if (!chineseDecimal.equals("零零")) { result = result + "点" + chineseDecimal; } } else { result = chineseInteger + chineseDecimal; } if (flag) { // 如果是负数,加上"负" return "负" + result; } else { return result; } } /** * 分离整数部分和小数部分 * @param str * @return */ private static String[] separateNum(String str) { String integerStr;// 整数部分数字 String decimalStr;// 小数部分数字 if (str.indexOf('.') >= 1) { integerStr = str.substring(0, str.indexOf('.')); decimalStr = str.substring(str.indexOf('.') + 1); if (decimalStr.length() > 2) { decimalStr = decimalStr.substring(0, 2); } } else if (str.indexOf('.') == 0) { integerStr = ""; decimalStr = str.substring(1); } else { integerStr = str; decimalStr = ""; } return new String[] {integerStr, decimalStr}; } /** * 将字符串转为int数组 * @param number 数字 * @return */ private static int[] toIntArray(String number) { int[] array = new int[number.length()]; for (int i = 0; i 1 && integers[i + 1] != 0) { key += NUMBERS[0]; } } chineseInteger.append(integers[i] == 0 ? key : (NUMBERS[integers[i]] + IUNIT[length - i - 1])); } return chineseInteger.toString(); } /** * 简体中文整数 * @param integers * @param isWan * @return */ private static String simplifiedChineseInteger(int[] integers, boolean isWan) { StringBuilder chineseInteger = new StringBuilder(""); int length = integers.length; for (int i = 0; i 1 && integers[i + 1] != 0) { key += CN_NUMBERS[0]; } if (length == 1 && integers[i] == 0) { key += CN_NUMBERS[0]; } } chineseInteger.append(integers[i] == 0 ? key : (CN_NUMBERS[integers[i]] + CN_IUNIT[length - i - 1])); } return chineseInteger.toString(); } /** * 将小数部分转为大写的金额 * @param decimals 小数部分的数字 * @return */ private static String getChineseDecimal(int[] decimals, boolean isSimplified) { StringBuilder chineseDecimal = new StringBuilder(""); if (!isSimplified) { for (int i = 0; i 1 && decimals[i + 1] != 0) { key += NUMBERS[0]; } chineseDecimal.append(decimals[i] == 0 ? key : (NUMBERS[decimals[i]] + DUNIT[i])); } } else { for (int i = 0; i 4) { String subInteger = ""; if (length > 8) { subInteger = integerStr.substring(length - 8, length - 4); } else { subInteger = integerStr.substring(0, length - 4); } return Integer.parseInt(subInteger) > 0; } else { return false; } } public static void main(String[] args) { String amount = "123456789012.123"; System.out.println(amount + ":" + AmountTransformUtils.toChinese(amount, true)); amount = "0.123"; System.out.println(amount + ":" + AmountTransformUtils.toChinese(amount, true)); amount = "0"; System.out.println(amount + ":" + AmountTransformUtils.toChinese(amount, true)); amount = "-1123456789.123"; System.out.println(amount + ":" + AmountTransformUtils.toChinese(amount, true)); amount = "120001.01"; System.out.println(amount + ":" + AmountTransformUtils.toChinese(amount, true)); amount = "120001.00"; System.out.println(amount + ":" + AmountTransformUtils.toChinese(amount, true)); System.out.println("================="); System.out.println(amount + ":" + AmountTransformUtils.toChinese(amount, false)); amount = "0.123"; System.out.println(amount + ":" + AmountTransformUtils.toChinese(amount, false)); amount = "0"; System.out.println(amount + ":" + AmountTransformUtils.toChinese(amount, false)); amount = "-1123456789.123"; System.out.println(amount + ":" + AmountTransformUtils.toChinese(amount, false)); amount = "120001.01"; System.out.println(amount + ":" + AmountTransformUtils.toChinese(amount, false)); amount = "120001.00"; System.out.println(amount + ":" + AmountTransformUtils.toChinese(amount, false)); }} 测试结果:
()123456789012.123:一千二百三十四亿五千六百七十八万九千零一十二点一二0.123:零点一二0:零-1123456789.123:负一十一亿二千三百四十五万六千七百八十九点一二120001.01:一十二万零一点零一120001.00:一十二万零一=================120001.00:壹拾贰万零壹元0.123:壹角贰分0:零元-1123456789.123:负壹拾壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元壹角贰分120001.01:壹拾贰万零壹元零壹分120001.00:壹拾贰万零壹元Process finished with exit code 0