A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 敗唫①輩ふ 中级黑马   /  2013-11-6 19:35  /  1212 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天看到了一个题目:
金额转换,阿拉伯数字转换成中国传统形式。
        例如: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);
        }

}

我是这样做的,感觉有点麻烦,有没有更简单一点的办法呢?求指点!

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

2 个回复

倒序浏览
用面向对象的方式试一下把,我以前做过的,将单位(个,十,白,千。万,亿)都创建成类,
每个类都有一个parse()方法,然后主函数判断给出的数的位数,再动态的实例化相应的单位,
就行了!
自己动手做吧,我这边还没有现成的代码。。。{:soso_e151:}

评分

参与人数 1黑马币 +8 收起 理由
敗唫①輩ふ + 8 赞一个!

查看全部评分

回复 使用道具 举报
上次做过,代码也不怎么少。先建立两个字符串数组,分别装零到玖   ;分角元......... 亿兆;
然后就是在输入数字每个位子进行查找读数,最后在处理(if)中间的零。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马