黑马程序员技术交流社区

标题: 代码优化 [打印本页]

作者: 董将    时间: 2012-12-21 15:19
标题: 代码优化
本帖最后由 董将 于 2012-12-22 19:44 编辑

在看张孝祥老师的面试宝典的时候发现这么一个问题,就是阿拉伯数字,我想让其转换成一下格式的,帮忙在我代码的基础上给优化一下把,另外末尾加上一个整。
要求,10001结果是一万零一元整
附上自己代码
public class ZhuanHuan {
        //首先创建两个数组,定义位数上的读法以及后缀名称,如1之后对应元,10是拾元
        private static final char[] data = new char[]{
                        '零','壹','贰','叁','肆','伍','陆','柒','捌','玖'
                };
        private static final char[] units = new char[]{
                '元','拾','佰','仟','万','拾','佰','仟','亿'
        };
        //创建主函数,输出135689123对应的中国传统形式金额调用转换方法
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                System.out.println(convert(10001));
        }
        //创建一个名字叫convert的方法
        public static String convert(int money)
        {
                //在这里创建一个StringBuffer对象
                StringBuffer sbf = new StringBuffer();
                int unit = 0;
                //当输入0 的时候直接输出零元
                while(money==0){
                        System.out.println("零元");
                        break;
                }
                //当输入的数值非零的时候进行判断
                while(money!=0)
                {
                        sbf.insert(0,units[unit++]);
                        int number = money%10;
                        sbf.insert(0, data[number]);
                        money /= 10;
                }
                //转化成字符串形式输出
                return sbf.toString();
        }
        }

作者: 王进亮    时间: 2012-12-21 21:11
public class ZhuanHuan {
        //首先创建两个数组,定义位数上的读法以及后缀名称,如1之后对应元,10是拾元
        private static final char[] data = new char[]{
                        '零','壹','贰','叁','肆','伍','陆','柒','捌','玖'
                };
        private static final char[] units = new char[]{
                '元','拾','佰','仟','万','拾','佰','仟','亿'
        };
        //创建主函数,输出135689123对应的中国传统形式金额调用转换方法
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                System.out.println(convert(10001));
        }
        //创建一个名字叫convert的方法
        public static String convert(int money)
        {
                //在这里创建一个StringBuffer对象
                StringBuffer sbf = new StringBuffer();
                int unit = 0;
                //当输入0 的时候直接输出零元
                sbf.insert(0,"整");//在传换前,先插手整
                while(money==0){
                        System.out.println("零元");
                        break;
                }
                //当输入的数值非零的时候进行判断
                while(money!=0)
                {
                        sbf.insert(0,units[unit++]);
                        int number = money%10;
                        sbf.insert(0, data[number]);
                        money /= 10;
                }
                //转化成字符串形式输出
                return sbf.toString();
        }
        }
你要的是不是这种效果:壹万零仟零佰零拾壹元整
作者: 徐兆进    时间: 2012-12-22 00:56
先看下解决的思路
我是这样想的
http://bbs.itheima.com/forum.php?mod=attachment&aid=MTA5Njh8NDdiYmY3ZWJkYzQ5NTQ5NGJiMWYyZjEzNTkzYzVmMDR8MTczMjI3NDM0Ng%3D%3D&request=yes&_f=.jpg
下面是代码 注释的很清楚 经过测试 输出的内容完全符合 我们日常口头的表述
  1. public class ZhuanHuan {
  2.         // 首先创建两个数组,定义位数上的读法以及后缀名称,如1之后对应元,10是拾元
  3.         private static final char[] data = new char[] { '零', '壹', '贰', '叁', '肆',
  4.                         '伍', '陆', '柒', '捌', '玖' };
  5.         private static final char[] units = new char[] { '元', '拾', '佰', '仟', '万',
  6.                         '拾', '佰', '仟', '亿' };

  7.         // 创建主函数,输出135689123对应的中国传统形式金额调用转换方法
  8.         public static void main(String[] args) {
  9.                 // TODO Auto-generated method stub
  10.                 System.out.println(convert(210));
  11.         }

  12.         // 创建一个名字叫convert的方法
  13.         public static String convert(int money) {
  14.                 // 在这里创建一个StringBuffer对象
  15.                 StringBuffer sbf = new StringBuffer();
  16.                 //一定会输出“xxx元整”所以先加上
  17.                 sbf.insert(0, "元整");
  18.                 int unit = 0;
  19.                 // 当输入0 的时候直接输出零元
  20.                 while (money == 0) {
  21.                         System.out.println("零元");
  22.                         break;
  23.                 }
  24.                 // 当输入的数值非零的时候进行判断
  25.                 while (money != 0) {
  26.                         int number = money % 10;
  27.                         //取余的值为0说明在此位上的数字为0则舍弃单位的输出
  28.                         if (number == 0) {
  29.                                 //此时判断它的上一位是否为0防止出现“xxx零零xxx整”输出的情况   同时判断他的是否是个位防止出现“xxx零元整”的 输出
  30.                                 if (!sbf.substring(0, 1).equals("零")&&!sbf.substring(0, 1).equals("元")) {
  31.                                         sbf.insert(0, data[0]);
  32.                                 }//因为个位已经加上单位所以要在unit>0的情况下在输出单位
  33.                         } else if(number>0&&unit>0){
  34.                                
  35.                                 sbf.insert(0, units[unit]);
  36.                         }
  37.                         //如果值出不为0则输出值
  38.                         if (number != 0) {
  39.                                 sbf.insert(0, data[number]);
  40.                         }
  41.                         money /= 10;
  42.                         //随着位数的上涨变换单位
  43.                         unit++;
  44.                 }
  45.                 // 转化成字符串形式输出
  46.                 return sbf.toString();
  47.         }
  48. }
复制代码
第一次发帖 可能做的不好哈 请见谅。。。。。

未命名.jpg (23.15 KB, 下载次数: 49)

图片

图片

作者: 徐兆进    时间: 2012-12-22 00:57
徐兆进 发表于 2012-12-22 00:56
先看下解决的思路
我是这样想的
http://bbs.itheima.com/forum.php?mod=attachment&aid=MTA5Njh8NDdiYmY3ZWJkYzQ5NTQ5NGJiMWYyZjEzNTkzYzVmMDR8MTczMjI3NDM0Ng%3D%3D&request=yes&_f=.jpg

不好意思 图到下面去了。。。。
作者: 徐兆进    时间: 2012-12-22 01:39
刚才发现了一个bug 要加上这句话 在
  1.         if (number == 0) {
  2.                                 // 此时判断它的上一位是否为0防止出现“xxx零零xxx整”输出的情况 同时判断他的是否是个位防止出现“xxx零元整”的 输出
  3.                                 if (!sbf.substring(0, 1).equals("零")
  4.                                                 && !sbf.substring(0, 1).equals("元")) {
  5.                                         sbf.insert(0, data[0]);
  6.                                 }
  7.                                 if (unit == 4) {
  8.                                         sbf.insert(0, "万");
  9.                                 }
  10.                         }
复制代码
才能保证最完美的输出 不然当数字大于10万的时候且没有个位的时候 会把万给吐了。。。 刚才发现的
作者: 董将    时间: 2012-12-22 17:11
多谢指点,问题已经解决




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2