java人民币数字转大写汉字(小写转为大写).java

您所在的位置:网站首页 java数字大小写转换 java人民币数字转大写汉字(小写转为大写).java

java人民币数字转大写汉字(小写转为大写).java

2024-01-10 15:01| 来源: 网络整理| 查看: 265

对上篇文章优化,更简单易懂

java--人民币小写(金额)转为大写(金额转换)_CY_99的博客-CSDN博客_实数小写金额转大写pta

1,实现思路

        因为汉语读法的特殊性把数字通过四位进行分割,因为千、百、十是重复使用的(壹百,壹百万,壹佰亿)。千、百、十我们看做四位中的小单位。亿和万看做四位结束后的大单位。分为两个单位数组。如下:

//四位间隔的大单位 String BigUnit[] = {"亿", "万", "元"}; //四位之间的小单位 String smallUnit[] = {"千", "百", "十", ""}; //通过map来进行大小写转换。 String[] upNum = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};

        通过两层循环,外层控制大单位在数组中索引和按照四位分割的字符串截取。内层循环进行对四位之间的处理(包括汉字转换和单位拼接),如下:

for (int i = 0; i < length; i++) { //1.取大单位 //2.字符串分割 //3.处理四位之间数据 substrNum:分割后的字符串 for (int j = 0; j < substrNum.length(); j++) { //汉字转换和单位拼接 TODO } //重置开始索引。 indexS = indexE; } 2.实现

有了思路,下面对具体的汉字转换和单位拼接进行实现。因为要控制0在不同位置的记录所以,要考虑全面。最后实现如下:

public static String dealMoney(String inputStr) { StringBuilder resultStrBuld = new StringBuilder(); String[] split = inputStr.split("\\."); String intStr = split[0]; //@@@@@@@@@@处理整数部分 try { //四位间隔的大单位 String BigUnit[] = {"亿", "万", "元"}; //四位之间的小单位 String smallUnit[] = {"千", "百", "十", ""}; String[] upNum = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"}; if (intStr.matches("^[0]+$")) { //如果全是输入的 0 返回 if(split.length==2 && split[1].matches("^[0]+$")){ return "零元零角零分"; } } //去掉以整数部分为0开头的情况 eg:0000456 return 456 intStr = cutFrontZeros(intStr); //按照四位进行处理进行转换,length是处理的次数 int length = intStr.length() / 4; if ((intStr.length() % 4) > 0) { //有余数次数+1 length++; } //获取截取的前索引 int indexS = 0; int indexE = 0; //处理四位间隔数据 for (int i = 0; i < length; i++) { //取大单位的索引 int Bindex = 0; if (length < 3) { Bindex = i + (3 - length); } else { Bindex = i; } //分割索引 if (i == 0 && ((intStr.length() % 4) > 0)) { indexE = intStr.length() % 4; } else { indexE = indexE + 4; } String substrNum = intStr.substring(indexS, indexE); //处理四位之间数据 for (int j = 0; j < substrNum.length(); j++) { //判断截取字符串之后是否全是0 boolean subStrAllzero = false; //substrNum后面全是0 if (substrNum.substring(j, substrNum.length()).matches("^[0]+$")) { subStrAllzero = true; } //判断这一位是否是0 boolean thisCharIs = false; if ("0".equals(String.valueOf(substrNum.charAt(j)))) { thisCharIs = true; } else { thisCharIs = false; } //取小单位索引 int Sindex = 0; if (substrNum.length() != 4) { Sindex = Sindex + (4 - substrNum.length() + j); } else { Sindex = j; } /*拼接数字对应汉字 如果后面全是0拼接单位,并结束循环(需要剔除0000这种情况) 否则拼接大写汉字,如果上一位且这一位是零不拼接汉字 */ if (subStrAllzero) { if (j != 0 || i == (length - 1)) { resultStrBuld.append(BigUnit[Bindex]); } break; } else { //if((!lastCharIs || !thisCharIs)) if (resultStrBuld.toString().endsWith("零") && thisCharIs) { } else { resultStrBuld.append(upNum[Integer.parseInt(String.valueOf(substrNum.charAt(j)))]); } } /* * 拼接单位 * 如果是最后一位,拼接大单位 * 否则拼接小单位 * 如果上一位是零则不拼接单位,等非零情况拼接单位 * */ if ((j == (substrNum.length() - 1))) { resultStrBuld.append(BigUnit[Bindex]); } else { if (!resultStrBuld.toString().endsWith("零")) { resultStrBuld.append(smallUnit[Sindex]); } } } //重置字符串截取的开始索引。 indexS = indexE; } //@@@@@@@@@@处理整数部分 END //@@@@@@@@@@处理小数部分 if (split.length == 2) { String point = split[1]; if (point.length() == 1) { resultStrBuld.append(upNum[Integer.parseInt(String.valueOf(point.charAt(0)))]).append("角").append("零分"); } else { resultStrBuld.append(upNum[Integer.parseInt(String.valueOf(point.charAt(0)))]).append("角").append(upNum[Integer.parseInt(String.valueOf(point.charAt(1)))]).append("分"); } } else { resultStrBuld.append("整"); } } catch (Exception e) { e.printStackTrace(); return "null"; } return resultStrBuld.toString(); } /** * 去掉第一位为0的情况 * 0000000001.02 = 1.02 * * @param str * @return */ public static String cutFrontZeros(String str) { //如果全为整数部分全为0,保留一个0 if("".equals(str.replaceAll("0",""))){ return "0"; } String s = str; if (str.startsWith("0")) { s = cutFrontZeros(str.substring(1, str.length())); } return s; } 3.测试

我们进行验证一下。分别对101,10010,10100000,10000000001,100010000100,100.2,100001.02,01.62进行输出测试。对输入数据进行了限制,最大支持12位整数,两位小数。

if (num.matches("^[0-9]{0,12}|[0-9]{0,12}+([.]{1}[0-9]{1,2})$")) { System.out.println(dealMoney(num)); } else { System.out.println("请检查金额(整数位不能超过12位,小数不能超过2位)"); }

测试结果:

101:壹百零壹元整 10010:壹万零壹十元整 10100000:壹千零壹十万元整 10000000001:壹百亿零壹元整 100010000100:壹千亿壹千万零壹百元整 100.2:壹百元贰角零分 100001.02:壹十万零壹元零角贰分 01.62:壹元陆角贰分

 :如果大家测试有问题,可以评论留言。别忘了收藏哦~

版权归属作者(CY_99),未经许可,严禁转载!

——2023-02-06



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3