Java 将数字金额转成中文大写
一个 Java 将数字金额转成中文大写的工具类,还不是很完善。
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 81 82 83 84 85 86 87 | import java.util.regex.Matcher; import java.util.regex.Pattern; public class ChineseYuanUtil { private static final Pattern AMOUNT_PATTERN = Pattern.compile( "^(0|[1-9]\\d{0,11})\\.(\\d\\d)$" ); // 不考虑分隔符的正确性 private static final char [] RMB_NUMS = "零壹贰叁肆伍陆柒捌玖" .toCharArray(); private static final String[] UNITS = { "元" , "角" , "分" , "整" }; private static final String[] U1 = { "" , "拾" , "佰" , "仟" }; private static final String[] U2 = { "" , "万" , "亿" }; /** * 将金额(整数部分等于或少于 12 位,小数部分 2 位)转换为中文大写形式. * * @param amount 金额数字 * @return 中文大写 * @throws IllegalArgumentException */ public static String convert(String amount) throws IllegalArgumentException { // 去掉分隔符 amount = amount.replace( "," , "" ); // 验证金额正确性 if (amount.equals( "0.00" )) { throw new IllegalArgumentException( "金额不能为零." ); } Matcher matcher = AMOUNT_PATTERN.matcher(amount); if (!matcher.find()) { throw new IllegalArgumentException( "输入金额有误." ); } String integer = matcher.group( 1 ); // 整数部分 String fraction = matcher.group( 2 ); // 小数部分 String result = "" ; if (!integer.equals( "0" )) { result += integer2rmb(integer) + UNITS[ 0 ]; // 整数部分 } if (fraction.equals( "00" )) { result += UNITS[ 3 ]; // 添加[整] } else if (fraction.startsWith( "0" ) && integer.equals( "0" )) { result += fraction2rmb(fraction).substring( 1 ); // 去掉分前面的[零] } else { result += fraction2rmb(fraction); // 小数部分 } return result; } // 将金额小数部分转换为中文大写 private static String fraction2rmb(String fraction) { char jiao = fraction.charAt( 0 ); // 角 char fen = fraction.charAt( 1 ); // 分 return (RMB_NUMS[jiao - '0' ] + (jiao > '0' ? UNITS[ 1 ] : "" )) + (fen > '0' ? RMB_NUMS[fen - '0' ] + UNITS[ 2 ] : "" ); } // 将金额整数部分转换为中文大写 private static String integer2rmb(String integer) { StringBuilder buffer = new StringBuilder(); // 从个位数开始转换 int i, j; for (i = integer.length() - 1 , j = 0 ; i >= 0 ; i--, j++) { char n = integer.charAt(i); if (n == '0' ) { // 当 n 是 0 且 n 的右边一位不是 0 时,插入[零] if (i < integer.length() - 1 && integer.charAt(i + 1 ) != '0' ) { buffer.append(RMB_NUMS[ 0 ]); } // 插入[万]或者[亿] if (j % 4 == 0 ) { if (i > 0 && integer.charAt(i - 1 ) != '0' || i > 1 && integer.charAt(i - 2 ) != '0' || i > 2 && integer.charAt(i - 3 ) != '0' ) { buffer.append(U2[j / 4 ]); } } } else { if (j % 4 == 0 ) { buffer.append(U2[j / 4 ]); // 插入[万]或者[亿] } buffer.append(U1[j % 4 ]); // 插入[拾]、[佰]或[仟] buffer.append(RMB_NUMS[n - '0' ]); // 插入数字 } } return buffer.reverse().toString(); } } |
测试类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public static void main(String[] args) { System.out.println(ChineseYuanUtil.convert( "16,409.02" )); System.out.println(ChineseYuanUtil.convert( "1,409.50" )); System.out.println(ChineseYuanUtil.convert( "6,007.14" )); System.out.println(ChineseYuanUtil.convert( "1,680.32" )); System.out.println(ChineseYuanUtil.convert( "325.04" )); System.out.println(ChineseYuanUtil.convert( "4,321.00" )); System.out.println(ChineseYuanUtil.convert( "0.05" )); System.out.println(ChineseYuanUtil.convert( "1234,5678,9012.34" )); System.out.println(ChineseYuanUtil.convert( "1000,1000,1000.10" )); System.out.println(ChineseYuanUtil.convert( "9005,9009,9009.99" )); System.out.println(ChineseYuanUtil.convert( "5432,0001,0001.01" )); System.out.println(ChineseYuanUtil.convert( "1000,0000,1110.00" )); System.out.println(ChineseYuanUtil.convert( "1010,0000,0001.11" )); System.out.println(ChineseYuanUtil.convert( "1012,0000,0000.01" )); } |
输出结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 壹万陆仟肆佰零玖元零贰分 壹仟肆佰零玖元伍角 陆仟零柒元壹角肆分 壹仟陆佰捌拾元叁角贰分 叁佰贰拾伍元零肆分 肆仟叁佰贰拾壹元整 伍分 壹仟贰佰叁拾肆亿伍仟陆佰柒拾捌万玖仟零壹拾贰元叁角肆分 壹仟亿零壹仟万零壹仟元壹角 玖仟零伍亿玖仟零玖万玖仟零玖元玖角玖分 伍仟肆佰叁拾贰亿零壹万零壹元零壹分 壹仟亿零壹仟壹佰壹拾元整 壹仟零壹拾亿零壹元壹角壹分 壹仟零壹拾贰亿元零壹分 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架