package com.zxn.kotlin;
/**
* 10、 金额转换,阿拉伯数字转换成中国传统形式。
* 例如:1010 0000 1010
* 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
*
* @author Administrator
*/
public class Test10 {
/**
* @param args
*/
public static void main(String[] args) {
String str = "101000001010";
convertToChineseFormat(str);
}
/**
* 将字符串转换为中文格式
*
* @param str
*/
public static void convertToChineseFormat(String str) {
if (!str.matches("\\d+")) {//正则判断是不是数字
System.out.println("字符串" + str + "不是数字格式,无法转换!");
return;//不是 则返回
}
while (str.startsWith("0")) { //将字符串最前面的0去掉
str = str.substring(1, str.length());
}
char[] num = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
char[] cnNum = new char[]{'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'};
for (int i = 0; i < 10; i++) {//将字符串数字替换成中文数字,循环对应替换
str = str.replace(num[i], cnNum[i]);
}
StringBuilder sb = new StringBuilder(str);//StringBuilder存放字符串,用于插入删除操作
int index = str.length() - 1; //从第index个字符从后往前开始操作,操作一次,index--
//存放金额单位
String[] unit = {"", "拾", "佰", "仟"};
String[] unit4 = {"万", "亿"};
boolean flag = false;//判断前一个数是否为零的标记
for (int i = 0; i < str.length(); i++) {//循环体内对sb进行操作
//每4位插入万每8位插入亿,最低位先不设置单位
if (i % 4 == 0 && i != 0) {
//根据金额规则,单位万前面为4个零时,不插入万,并将index位置(最低位)的零删除
if ((i / 4 - 1) % 2 == 0 && index >= 3 && str.substring(index - 3, index + 1).equals("零零零零")) {
sb.deleteCharAt(index);
index--;
continue;
}
//否则在index+1位置插入相应的单位:万、亿
sb.insert(index + 1, unit4[(i / 4 - 1) % 2]);
}
//如果4位的最低位为零,删除最低位的零,将零标志置为true
if (i % 4 == 0 && str.charAt(index) == '零') {
sb.deleteCharAt(index);
flag = true;
index--;
continue;
}
//如果前一位为零并且这一位也为零,删除这一位的零
if (flag && str.charAt(index) == '零') {
sb.deleteCharAt(index);
index--;
continue;
}
//如果当前位为零,将零标志置为true
if (str.charAt(index) == '零') {
flag = true;
index--;
continue;
}
//当前位不为零,将零标志位置为false,插入金额单位
flag = false;
sb.insert(index + 1, unit[i % 4]);
index--;
//完善金额表示形式
sb.append("圆整");
System.out.println(sb.toString());
}
}
}
网友评论