黑马程序员---入学考试分析(金额转换)

来源:互联网 发布:软件开发保密制度 编辑:程序博客网 时间:2024/04/27 03:30

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

入学考试八道题在张老师的视频中都有讲到,只是第一道题做的时候,有些紧张,对于java的泛型考虑不严谨,所以在通过反射取add方法的参数时,直接用getMethod("add", Integer.class),未考虑到参数的去泛型话,通过查看api文档,才了解到List数组的add方法本身就是泛型的,所以应采用基类的字节码,即Object类的字节码。第一题原题如下:ArrayList<Integer> list = new ArrayList<Integer>(); 在这个泛型为Integer的ArrayList中存放一个String类型的对象。

做到第九道题时感觉有点幸运,因为这道题是自己以前参加蓝点杯比赛的时候做的原题,不过以前是用C编写的,不过解题的思路还清楚,于是很快就解决了,出现一点小问题就是迭代的条件的判断,因为关于i++的值传递问题,不过通过debug很快就发现了问题。

真正感觉有难度的是第十题,这道题用了一天的时间才解决掉。第十题的题目是金额转换,阿拉伯数字转换成中国传统形式。 例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整  。因为刚开始的时候没有很好的划分,原来想是把数据八位八位的分割,然后八位单独处理。可是经过研究单位之间的转换发现一个规律,就是很多时候都要单独处理以千为单位的四位数字,因此决定把他抽象出来作为一个独立的方法。这样一来紧跟着就进行分类,发现(个)圆,万,亿,万亿这都是四个间隔的,考虑实际的需要因此只做到万亿这个单位计量,这样就避免了原来的迭代。因为迭代中还涉及到单位之间的转换。先跟着确定大的框架,最让人头疼的是如何将多余的零去掉,结果发现自己对去零很不了解,经过搜索相关的业务和观察例子,得出如果四位全部为零的话,则只保留一个零,但是整数的最后四位除外,如果一个四位数的连续末尾有一个零,2个零,3个零则把零去掉,如果是前面有连续两个或三个零的话,则转换成一个零,但是除了整数部分的第一个四位除外。后经过代码的反复debug,终于完成了。代码如下:

class Arabic2China {
 private String[] bigUnit = { "圆", "万", "亿", "万亿" };
 private String[] smallUnit = { "千", "百", "拾" };
 private String[] chineseCapital = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒",
   "捌", "玖" };
 private String[] decimals = { "角", "分" };

 public String arabic2RMB(String num) {
  String result = null;
  StringBuilder sb = new StringBuilder();
  String decimaStr = "";
  String integerStr = "";
  String end = "";
  int testIndex = num.indexOf('.');
  // 如果有小数部分则分为两部分处理,否则为整数
  if (testIndex != -1) {
   // 保留两位有效数字
   decimaStr = num.substring(num.indexOf('.') + 1,
     num.indexOf('.') + 3);
   integerStr = num.substring(0, num.indexOf('.'));
   // 给小数部分加单位和转换数字
   end = decimaChange(decimaStr);
  }
  integerStr = num;
  // 给整数部分加单位和转换数字
  int length = integerStr.length();
  if (integerStr.length() % 4 == 0) {
   // 把整数部分分成4位一组,作为一个单元
   int part = integerStr.length() / 4;
   for (int i = 0; i < part; i++) {
    String spiltInteger = integerStr.substring(
      length - 4 * (i + 1), length - 4 * i);
    sb.insert(0, addUnit(spiltInteger, i));
   }
   result = sb.toString();
  } else {
   // 不能被4整除的话,在最前面用零补充到可以被4整除
   int part = integerStr.length() / 4 + 1;
   int fillZeroNum = 4 - integerStr.length() % 4;
   StringBuilder tmpSB = new StringBuilder(integerStr);
   for (int i = 0; i < fillZeroNum; i++) {
    tmpSB.insert(0, "0");
   }
   String newIntegerStr = tmpSB.toString();
   for (int i = 0; i < part; i++) {
    length = newIntegerStr.length();
    String newSpiltIntegerStr = newIntegerStr.substring(length - 4
      * (i + 1), length - 4 * i);
    sb.insert(0, addUnit(newSpiltIntegerStr, i));
   }
   result = sb.toString();
  }
  // 如果没有小数部分,则添加”整“
  if (end.equals("")) {
   result += "整";
  }
  // 如果开头是零的话,则把零清除掉
  if (result.substring(0, 1).equals("零")) {
   result = result.substring(1);
  }
  return result + end;
 }

 // 小数部分转换加单位
 private String decimaChange(String decimaStr) {
  String decimaResult = null;
  StringBuilder decimaSb = new StringBuilder();
  for (int i = 0; i < decimaStr.length(); i++) {
   //如果是零不加单位
   if (decimaStr.charAt(i) == '0') {
    int k = decimaStr.charAt(i) - 48;
    decimaSb.append(chineseCapital[k]);
   } else {
    int k = decimaStr.charAt(i) - 48;
    decimaSb.append(chineseCapital[k] + decimals[i]);
   }
  }
  decimaResult = decimaSb.toString().replace("零零", "");
  return decimaResult;
 }

 // 整数部分添加单位并完成数字转换
 private String addUnit(String splitInteger, int index) {
  String result = null;
  StringBuilder sb = new StringBuilder();
  String endTmp = bigUnit[index];
  changeChineseDigital(splitInteger, sb);
  if (index > 0) {
   // 如果4位有效数字都是零则保留一个零,如果是尾部有两个或三个零,则清除,否则保留一个
   String strSb = sb.toString().replaceAll("[零]{2,3}", "零");
   sb=new StringBuilder(strSb);
   if (sb.substring(sb.length() - 1).equals("零")){
   sb =new StringBuilder(sb.substring(0,sb.length() - 1)) ;
   }
   else{
   sb = new StringBuilder(strSb);
   }
   if (Integer.parseInt(splitInteger) != 0)
    result = sb.toString() + endTmp;
   else
    result = sb.toString();
  } else {
   String strSb = sb.toString().replaceAll("[零]{2,3}", "零");
   sb=new StringBuilder(strSb);
   if (sb.substring(sb.length() - 1).equals("零")){
    sb =new StringBuilder(sb.substring(0,sb.length() - 1)) ;
    }
    else{
    sb = new StringBuilder(strSb);
    }
   result = sb.toString() + endTmp;
  }
  return result == null ? "" : result;
 }

 // 将整数部分转换成中国传统数字
 private void changeChineseDigital(String splitInteger, StringBuilder sb) {
  for (int i = 0; i < splitInteger.length(); i++) {
   //如果是零不需要加单位
   if (splitInteger.charAt(i) == '0') {
    int k = splitInteger.charAt(i) - 48;
    sb.append(chineseCapital[k]);
   } else {
    int k = splitInteger.charAt(i) - 48;
    // 千,百,拾加上,个位不许要加
    if (i != splitInteger.length() - 1) {
     sb.append(chineseCapital[k] + smallUnit[i]);
    } else {
     sb.append(chineseCapital[k]);
    }
   }
  }
 }

}

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------