今天看到了一个题目:
金额转换,阿拉伯数字转换成中国传统形式。
例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
public class Test10 {
//数字大写
private static final String UPPERNUM = "零壹贰叁肆伍陆柒捌玖";
//单位
private static final String UNIT = "个拾佰仟";
//等级单位
private static final String GRADEUNIT = "万亿兆";
//每一级的长度
private static final int GRADE = 4;
//零钱单位
private static final String DECIMAL = "角分";
/**
* 获取输入的金额
* @return
* @throws Exception
*/
public static String getInputMoney() throws Exception{
BufferedReader bufferIn = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入要转换的数字金额(如有小数点,小数点后保留两位),按回车结束:");
//去除输入金额两边的空格
String money = bufferIn.readLine().trim();
return money;
}
/**
* 将数字金额转换成大写
* @param money 数字金额
* @return 返回转换结果
*/
private static String toBigMoney(String money){
//整则表达式,输入金额包含0-9的数字不超过16位,没有或有小数,如果有小数点后保留两位
String regex = "^([0-9]\\d{0,15})(\\.\\d\\d)?$";
//进行匹配操作
if(!money.matches(regex))
throw new RuntimeException("输入非法值,长度要小于16,小数点后要保留两位!");
String intPart = "";//整数位
String dotPart = "";//小数位
int dotPos;//小数点位置
if((dotPos = money.indexOf(".")) != -1){//存在小数点
intPart = money.substring(0, dotPos);//提取整数部分
dotPart = money.substring(dotPos+1);//提取小数部分
}else{//不存在小数点
intPart = money;
}
String intStr = intToBig(intPart);//转化整数部分为大写
String dotStr = dotToBig(dotPart);//转化小数部分为大写
if(intStr.length() == 0 && dotStr.length() == 0){
return "零圆";
}else if(intStr.length() != 0 && dotStr.length() == 0){
return intStr + "圆整";
}else if(intStr.length() != 0 && dotStr.length() != 0){
return intStr + "圆" + dotStr;
}else{
return dotStr;
}
}
/**
* 将整数部分转化为大写
* @param intPart 整数部分
* @return 返回整数部分的大写结果
*/
private static String intToBig(String intPart) {
int grade = intPart.length()/GRADE;//获取级长
String strTmp = "";//获取某级字符串
String result = "";//获取转化为大写的结果
if(intPart.length() % GRADE != 0){
grade = grade + 1;
}
//对每级数字处理,先处理最高级,然后再处理低级的
for(int i = grade;i > 0;i--){
strTmp = getNowGradeStr(intPart,i);//获取某级金额数值字符串
result += changeToSub(strTmp);//转化为大写
result = delZero(result);//去除连续的零
if(i > 1){
if(changeToSub(strTmp).equals("零零零零")){
result = result + "零";
}else{
//添加GRADEUNIT单位
result += GRADEUNIT.substring(i-2, i-1);
}
}
}
return result;
}
/**
* 获取某级金额数值字符串
* 整数部分从个位开始4位分为一级
* @param intPart 整数部分
* @param grade 级数
* @return 返回分级后的子串
*/
private static String getNowGradeStr(String intPart, int grade) {
String rsStr = "";
/*由高位向低位取子串*/
//第一次取最高位子串
if(intPart.length() <= grade*GRADE){
rsStr = intPart.substring(0, intPart.length() - (grade-1)*GRADE);
//System.out.println("if"+rsStr);
}else{//如果整数部分字符串长度大于4按从高位到低位顺序取子串
rsStr = intPart.substring(intPart.length() - grade*GRADE, intPart.length() - (grade-1)*GRADE);
// System.out.println("else"+rsStr);
}
// System.out.println(rsStr + " " + grade);
return rsStr;
}
/**
* 去除连续的零
* @param result 需要去除连续零的字符串
* @return 返回处理结果
*/
private static String delZero(String result) {
//前一个子串
String strBefore = "";
//当前子串
String strNow = "";
//存储处理结果的字符串,初始化为包含result字符串第一个字符的子串
String strResult= result.substring(0, 1);
//将这个子串作为被比较的前一个子串
strBefore = strResult;
/*循环并进行去除连续零操作*/
for(int i = 1;i < result.length();i++){
//当前获取的子串
strNow = result.substring(i, i+1);
//如果前一个子串是零,当前子串也是零,不做任何动作
if(strBefore.equals("零") && strNow.equals("零")){
;
}else{//否则,将当前子与strResult字符串拼接
strResult += strNow;
}
//将当前子串作为下一次比较的字符串
strBefore = strNow;
}
//如果最后一个字符是零,则删除它
if(strResult.substring(strResult.length()-1, strResult.length()).equals("零")){
strResult = strResult.substring(0, strResult.length()-1);
}
//System.out.println(strResult+"g");
return strResult;
}
/**
* 获取转化后的大写结果
* @param strTmp 需要被转换的某一级字符串
* @return 返回转换结果
*/
private static String changeToSub(String strTmp) {
//将转换结果存储到result字符串中
String result = "";
//需要被转换的字符串长度
int strLength = strTmp.length();
//开始转换
for(int i = 0; i < strLength;i++){
//将字符数字转换为整形
int num = Integer.parseInt(String.valueOf(strTmp.charAt(i)));
if(num == 0){//如果为0,转换为“零”
result += "零";
}else{
//将相应的大写数字存入字符串result
result += UPPERNUM.substring(num, num+1);
//在每个大写字母后面添加UNIT单位,按照从高位到低位顺序,不包括个位
if(i != strLength-1){
result += UNIT.substring(strLength-1-i, strLength-i);
}
}
}
//System.out.println(result+"g");
return result;
}
//将小数部分转化为大写
private static String dotToBig(String dotPart) {
//存储小数部分大写数字的字符串
String dotStr = "";
//开是转换
for(int i = 0;i < dotPart.length();i++){
int num = Integer.parseInt(dotPart.substring(i, i+1));
//如果小数部分不是零添加单位,否则不处理。
if(num != 0){
dotStr += UPPERNUM.substring(num, num+1) + DECIMAL.substring(dotPart.length()-2+i, dotPart.length()+i-1);
}
}
return dotStr;
}
/**
* @param args
*/
public static void main(String[] args) throws Exception{
//获取键盘输入金额
String money = getInputMoney();
//对金额进行转换
String result = toBigMoney(money);
//打印转换结果
System.out.println(result);
}
}
我是这样做的,感觉有点麻烦,有没有更简单一点的办法呢?求指点!
|