对上篇文章优化,更简单易懂
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),未经许可,严禁转载!文章来源:https://www.toymoban.com/news/detail-403218.html
——2023-02-06文章来源地址https://www.toymoban.com/news/detail-403218.html
到了这里,关于java人民币数字转大写汉字(小写转为大写).java的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!