public class TestToChinessCurrency {
public static void main(String[] args) {
TestToChinessCurrency tcc = new TestToChinessCurrency();
System.out.println(tcc.transfNumToCString("108010001800.01"));
}
/**
* 将数字转换成大写金额
* @param number
* 待转换的数字
* @return
* 大写金额
*/
private String transfNumToCString(String number) {
// 校验是否数字
try {
Double.parseDouble(number);
} catch (NumberFormatException e) {
return null;
}
// 转换操作
try {
String result = ""; // 返回值
// 是否含有小数部分,默认false
boolean bHasDot = false;
int dotIdx = number.indexOf(".");
if (dotIdx == -1) {
// 没有小数点,将小数点的位置设置成末尾
dotIdx = number.length();
} else {
bHasDot = true;
}
// 获取整数部分、小数部分
String beforeDot = number.substring(0, dotIdx).trim();
String afterDot = number.substring(dotIdx);
/* 处理整数部分 */
/**
* 圆、拾圆、佰圆、仟圆、万、拾万、佰万、仟万、亿、拾亿、佰亿、仟亿
* 分为3大级:"圆", "万", "亿",每大级下又有4小级
*/
String[] unit = { "圆", "万", "亿"};
String[] subunit = { "拾", "佰", "仟" };
// 定义所需变量
int count = 0; // 循环处理计数器
int subunitCnt = 0; // 小级计数器
int unitCnt = 0; // 大级计数器
char oldC = '3'; // 上一处理字符,默认3
char cc = '0'; // 当前处理字符,默认0
String zero = "零"; // 0转换字符
int len = beforeDot.length(); // 整数部分长度
boolean hasN = false; // 一次小级循环处理下来是否有非0数字
boolean oldHasN = false; // 上一次小级循环处理下来是否有非0数字
boolean allZero = true; // 是否全零
// 开始让,加上大级最低单位,result="圆"
result = unit[0] + result;
// 循环处理每位数
for (count = 0; count < len; ++count) {
// 如果小级计数器到0且循环计数器非0,即万级、亿级开始
if ((subunitCnt == 0) && (count != 0)) {
// 上一大级循环没有非0数字
if (!hasN) {
// 如果亿级,这时万级都是0,截去result中“万”
if (unitCnt % 2 == 0) {
result = result.substring(1);
}
} else if (oldC == '0') {
// 上一大级循环存在非0数字,且上一处理位0,即小级循环中仟为为零
result = zero + result;
}
// 加上本次大级单位
result = unit[unitCnt] + result;
// 先将hasN值赋予oldHasN,然后重置hasN为false
oldHasN = hasN;
hasN = false;
}
// 从个位开始处理
cc = beforeDot.charAt(len - count - 1);
// 上一处理字符、当前处理字符是否都为0,且本次大级循环已出现非0数字
if (oldC == '0' && cc != oldC && hasN) {
result = zero + result;
}
// 当前处理字符不为0
if (cc != '0') {
// 小级到“拾”及以后,加上小级单位
if (subunitCnt != 0) {
result = subunit[subunitCnt - 1] + result;
}
// 当前数字转换成大写
String ccStr = this.convertNum(cc);
// 连接上
result = ccStr + result;
// hasN应置为true
hasN = true;
// allZero应置为false
allZero = false;
}
// 当前处理字符cc赋予oldC
oldC = cc;
// 小级计数器++
++subunitCnt;
// 如果小级计数器到4,则大级计数器++且小级计数器置零
if (subunitCnt == 4) {
++unitCnt;
subunitCnt = 0;
}
}
// 对上述处理结果再处理
if (allZero) {
// 全0,对result赋值
result = "零圆";
} else {
// 截去result第一个字符可能出现的零
int zeroCnt = 0;
// 亿、万级全是0(不需要考虑第一级)
if (!hasN) {
++zeroCnt;
if (!oldHasN) {
++zeroCnt;
}
}
if (zeroCnt != 0) {
result = result.substring(zeroCnt);
}
// 如果result第一个字符还是零,截去,38646对应“零”
if (result.charAt(0) == (char)38646) {
result = result.substring(1);
}
}
// 处理小数部分
if (bHasDot) {
// 干掉小数点
afterDot = afterDot.substring(1).trim();
// 小数部分单位
String[] cornunit = { "角", "分" };
// 小数部分长度,最多两位
len = afterDot.length();
// 用于存小数数值
char[] corn = new char[2];
// 角
corn[0] = afterDot.charAt(0);
// 分,不存在赋值0
if (len > 1) {
corn[1] = afterDot.charAt(1);
} else {
corn[1] = '0';
}
// 如果角、分都为0,为整圆
if (corn[0] == '0' && corn[1] == '0') {
return result += "整";
}
// 处理小数部分之前,如果整数部分全0, 先置result为空串
if (allZero) {
result = "";
}
for (int i = 0; i < 2; ++i) {
// 处理角、分
char curchar = corn[i];
String curStr = this.convertNum(curchar);
result = result + curStr;
// 角
if (i == 0) {
if (curchar != '0') {
// 存在角值,加上单位
result = result + cornunit[0];
} else if (allZero) {
// 没角值,且整数部分全0,置result为空串
result = "";
}
}
// 分,肯定存在值,否则到不了这
if (i == 1) {
result = result + cornunit[1];
}
}
} else {
result = result + "整";
}
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 将1、2、3...转换成壹、贰、叁
* @param num
* 数字
* @return
* 大写中文数字
*/
private String convertNum(char num) {
String numStr = "";
switch (num) {
case '1':
numStr = "壹";
break;
case '2':
numStr = "贰";
break;
case '3':
numStr = "叁";
break;
case '4':
numStr = "肆";
break;
case '5':
numStr = "伍";
break;
case '6':
numStr = "陆";
break;
case '7':
numStr = "柒";
break;
case '8':
numStr = "捌";
break;
case '9':
numStr = "玖";
case '0':
numStr = "零";
}
return numStr;
}
}
金额转换成RMB大写
最新推荐文章于 2023-03-10 13:39:59 发布