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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黑马-唐磊 于 2012-5-30 15:52 编辑

这是张孝祥老师面试宝典的一题,我主要是对convert方法的代码有点困惑,希望大虾们能详细解释一下
public class Demo {
        private static final char[] data=new char[]{
                   '零','壹','贰','叁','肆','伍','陆','柒','捌','玖'
        };
        private static final char[] units=new char[]{
                '元','拾','佰','仟','万','拾','佰','仟','亿'
        };
        public static void main(String[] args) {
                System.out.println(convert(35543));
        }
        public static String convert(int money){
                StringBuffer sb=new StringBuffer();
                int unit=0;
                while(money!=0){
                        sb.insert(0, units[unit++]);
                        int number=money%10;
                        sb.insert(0, data[number]);
                        money/=10;
                }
                return sb.toString();
        }
}

4 个回复

正序浏览
我不给你敲代码
首先,你要先明白这个程序是干嘛的?
它是将一串数字,转换为人民币的大写形式。
其次,它是用什么方法来实现的?
它是运用查表发来实现的。

具体的代码的实现。
首先是先定义两个数组,按照依次的顺序来存储人名币大写形式以及个个单位。

并且通过int number=money%10;来获取当前最后一位数,也就是从个位开始获取,直到最高位。
和money/=10;来控制循环条件

然后通过number获取的角标依次在数组中查。然后显示。

虽然我讲的不是很好,但是你带着这个思想再去看代码就容易的多了。

回复 使用道具 举报
这个convert() 的编写用到了两个知识点:
第一个是StringBuffer类的insert方法其全称是public StringBuffer insert(int offset,char c) StringBufferl实例有自己的缓冲区,当第一次存入元、叁后,其0偏移量在缓冲区就会前移四个字节,从下一个字节开始从新存入数据。依次在存入拾、肆等。
第二个就是通过取余获得整数的每个位数。money%10获得最低位数值,然后呢money/10进行下一轮的计算在次获得最低位数值,这样就把整数从个位到十位一直到万位得出来了,如楼上所描述的一样。
回复 使用道具 举报
本帖最后由 武剑峰 于 2012-5-30 15:39 编辑

请看用法:
insert(int offset, char c)
向offset位置插入字符变量c的内容
                StringBuffer sb2 = new StringBuffer("wujianfeng");
                System.out.println(sb2.insert(1, 'a'));
                System.out.println(sb2.insert(2, 'b'));
                System.out.println(sb2.insert(1, 'c'));
                System.out.println(sb2.insert(0, 'd'));
结果为:
waujianfeng
wabujianfeng
wcabujianfeng
dwcabujianfeng
那么这个就会看出来StringBuffer变量创建后,从左边往右数位置号分别为0123456789,那么楼主的问题就解答了,
注意这个变量int unit=0                                 //其实这个变量定义为i,就不会被混淆了
                while(money!=0){               //判断变量是否为零,其实实际中应该判断变量是否大于0
                        sb.insert(0, units[unit++]);  //如果不为零在sb的第零位插入units的第unit个值,中括号里面的unit 相当于i++,插入后整型变量unit值加1
                        int number=money%10;    //因为是int型,求余得到个位数是多少,列如51%10=1
                        sb.insert(0, data[number]);//在sb的第零位插入data数组的第number个值,这里的number相当于j
                        money/=10;                    //money的值变小10倍,小于零的部分就没有了,列如564/10=56
                }
回复 使用道具 举报
本帖最后由 李哲 于 2012-5-30 15:09 编辑

可是这个代码和入学考试最后的题还差得远,比如不能超过亿,不能处理50003类似的数值。还要经过很多判断语句的添加
  1. public class Demo {
  2.     private static final char[] data=new char[]{
  3.                '零','壹','贰','叁','肆','伍','陆','柒','捌','玖'
  4.     };
  5.     private static final char[] units=new char[]{
  6.             '元','拾','佰','仟','万','拾','佰','仟','亿'
  7.     };
  8.     public static void main(String[] args) {
  9.             System.out.println(convert(35543));
  10.     }
  11.     public static String convert(int money){
  12.             StringBuffer sb=new StringBuffer();//定义StringBuffer来盛放汉字字符
  13.             int unit=0;
  14.             while(money!=0){                   
  15.                             sb.insert(0, units[unit++]);
  16.                                             //StringBuffer的第1个位置插入'元'
  17.                                             //StringBuffer的第1个位置插入'拾',
  18.                                             //StringBuffer的第1个位置插入'佰'
  19.                                             //StringBuffer的第1个位置插入'仟'
  20.                                             //StringBuffer的第1个位置插入'万'
  21.                            
  22.                     int number=money%10;
  23.                                     //35543%10=3
  24.                                     //3554%10=4
  25.                                     //355%10=5
  26.                                     //35%10=5
  27.                                     //3%10=3
  28.                     sb.insert(0, data[number]);
  29.                                     //'元'之前插入'叁'
  30.                                     //'拾'之前插入'肆'
  31.                                     //'拾'之前插入'伍'
  32.                                     //'拾'之前插入'伍'
  33.                                     //'拾'之前插入'叁'
  34.                     
  35.                     money/=10;
  36.                                     //35543/10=3554
  37.                                     //3554/10=355
  38.                                     //355/10=35
  39.                                     //35/10=3
  40.                                     //3/10=0
  41.             }
  42.             return sb.toString();
  43.     }
  44. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马