数字金额转大写



public class ConverChMoney {
private static final String[] CH_NUMBER = {"零","壹","贰","叁","四","五","六","七","八","镹"};//数组下标即为对应的大写数字
private static final String[] LEVEL1 = {"","十","佰","仟"};
private static final String[] LEVEL2 = {"","万","亿"};
private static final String[] UNITS = {"元", "角", "分", "整"};
private static final String REGEX = "^(0|[1-9]\\d{0,11})(\\.(\\d\\d))?$";//金额正则表达式格式:123或123.00

/**将数字金额:123456789转换为大写形式如:壹亿贰千叁百四十五万六千七百八十九元
* 金额格式:123或123.00
* 将数字金额按4位长度截取,分三级(千、万、亿),最多支持到亿
* 缺少金额格式正确性校验
* @param args
*/
public static void main(String[] args) {
long startTime=System.currentTimeMillis(); //获取开始时间
//String money = "123456789";//壹亿贰千叁百四十五万六千七百八十九元
String numMoney = "123456789.30";
System.out.println("数字金额:" + numMoney);

if(!numMoney.matches(REGEX)){
System.err.println("输入金额错误!");
System.exit(0);
}
String integerNum = "";//整数部分
String fractionNum = "";//小数部分
String chMoney = "";
if(numMoney.indexOf(".") == -1){
if(!integerNum.equals("0")){
chMoney += converInteger(numMoney);//转换整数部分
}
}else{
//有小数部分
integerNum = numMoney.substring(0, numMoney.indexOf("."));
fractionNum = numMoney.substring(numMoney.indexOf(".")+1);
chMoney += converInteger(integerNum);//转换整数部分
if (fractionNum.equals("00")) {
chMoney += UNITS[3]; // 添加“整”
}else if(fractionNum.startsWith("0") && integerNum.equals("0")){
// 如果整数部分为0,则去掉分前面的“零”
chMoney += convertFraction(fractionNum).substring(1);
}else{
chMoney += convertFraction(fractionNum);
}
integerNum = converInteger(integerNum);////转换整数部分
}

System.out.println("转换之后:" + chMoney);
long endTime=System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
}
/**
* 转换金额小数部分
* @param fractionNum
* @return
*/
public static String convertFraction(String fractionNum){
char jiao = fractionNum.charAt(0); // 角
char fen = fractionNum.charAt(1); // 分
return (CH_NUMBER[jiao - '0'] + (jiao > '0' ? UNITS[1] : "")) + (fen > '0' ? CH_NUMBER[fen - '0'] + UNITS[2] : "");

}
/**
* 转换金额整数部分
* @param integerNum
* @return
*/
public static String converInteger(String integerNum){
int numLen = integerNum.length();
int remainder = numLen % 4;//余数
int divNum = numLen / 4;//取整
System.out.println("remainder:"+remainder+" divNum:"+divNum);
StringBuilder chMoney = new StringBuilder("");//最终输出结果
if(numLen <= 4){
chMoney.append(convertNumRange(integerNum));
}else{
String range;//分割的数字段
int startIndex = 0;
int i;
for(i = 0 ; i < divNum ; i++){
//从右向左按4位长度依次截取
startIndex = (numLen - 4)-(i*4);
range = integerNum.substring(startIndex , numLen - (i*4));
chMoney.insert(0, convertNumRange(range) + LEVEL2[i]);//加上金额级别("万","亿")
}
if(remainder != 0){
range = integerNum.substring( 0, startIndex);
chMoney.insert(0, convertNumRange(range) + LEVEL2[i]);//加上金额级别("万","亿")
}

}
return chMoney.toString()+UNITS[0];

}
/**
* 转换小于、等于4( <=4) 的整数部分数字
* @param number
* @return
*/
public static String convertNumRange(String number){
StringBuilder chineseMoney = new StringBuilder("");
char numChar;
int indexFromRight = 0;//从右边起开始的索引下标,下标为0表示个位数,1表示10位,2表示百位...
int maxNumIndex = number.length() - 1;//数字最大下标(下表从0算起,所以为长度减1)
for(int i = maxNumIndex ; i >= 0 ; i--){
numChar = number.charAt(i);//将数字从右向左逐一取出
if(numChar == '0'){
// 当 numChar 是 0 且不为个位数且 numChar 的右边一位不是0时,插入“零” (避免出现“零零”)
if(i < maxNumIndex && number.charAt(i + 1) != '0'){
chineseMoney.append(CH_NUMBER[0]);
}
}else{
chineseMoney.append(LEVEL1[indexFromRight]);//插入"十","佰","仟"
chineseMoney.append(CH_NUMBER[numChar - '0']);//插入大写数字
}
indexFromRight++;//下标加1
}
return chineseMoney.reverse().toString();
}

}

你可能感兴趣的:(java,正则表达式)