| 今天看到了一个题目: 金额转换,阿拉伯数字转换成中国传统形式。
 例如: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);
 }
 
 }
 
 我是这样做的,感觉有点麻烦,有没有更简单一点的办法呢?求指点!
 
 |