黑马程序员技术交流社区

标题: 把金钱转换为大写. [打印本页]

作者: BackGaoz    时间: 2016-4-27 23:18
标题: 把金钱转换为大写.
  1. package com.itheima;

  2. import java.util.Scanner;

  3. public class Test10 {
  4.         /*
  5.          * 第10题:
  6.          *
  7.          * 金额转换,阿拉伯数字转换成中国传统形式。
  8.          *
  9.          *                                 例如:101000001010   转换为   壹仟零壹拾亿零壹仟零壹拾圆整
  10.          *
  11.          * 分析:
  12.          * 1.先定义字符数组,里边存储了中文数组.中文整数单位,中文小数单位
  13.          * 2.键盘录入一个金额,并转换成数字字符串
  14.          * 3.对字符串进行判断.如果超过了能转换的最大单位,提示金额过大
  15.          * 4.数字字符分为两部分,整数和小数
  16.          */
  17.         private static final String[] chNum = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};                                                                                //中文的数字
  18.         private static final String[] iunit = {"元","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟","万","拾","佰","仟"};                //整数部分单位,最多十六位
  19.         private static final String[] dunit = { "角", "分", "厘" };                                                                                                                                                        //小数部分的单位
  20.         public static void main(String[] args) {
  21.                 Scanner sc = new Scanner(System.in);
  22.                 System.out.println("请输入金额");
  23.                 String num = sc.nextLine();
  24.                 System.out.println(toChineseNum(num));
  25.         }

  26.         private static String toChineseNum(String num) {
  27.                 String integerLine;                                                                                                                                                // 整数部分数字
  28.             String decimalLine;                                                                                                                                                // 小数部分数字
  29.             
  30.             //分别截取整数部分和小数部分
  31.             if (num.indexOf(".") > 0) {                                                                                                                                //做判断,有小数点并且小数点在0索引后边
  32.                       integerLine = num.substring(0, num.indexOf("."));                                                        //截取从第一个字符开始到小数点前一个字符,也就是整数部分
  33.                       decimalLine = num.substring(num.indexOf(".") + 1);                                                        //截取从小数点后一位开始到字符串尾,就是小数部分
  34.                     } else if (num.indexOf(".") == 0) {                                                                                                        //判断如果该数字字符,第一位就是小数点
  35.                       integerLine = "";
  36.                       decimalLine = num.substring(1);                                                                                                //从小数点后一位开始截取小数部分
  37.                     } else {
  38.                       integerLine = num;                                                                                                                                //另外就是没有小数点,也就是只有整数部分
  39.                       decimalLine = "";
  40.                     }
  41.             
  42.             //去掉整数部分的首0
  43.             if (!integerLine.equals("")) {                                                                                                                                //如果整数部分不为空串
  44.                     integerLine = Long.toString(Long.parseLong(integerLine));                                        //就去掉首位的0
  45.                       if (integerLine.equals("0")) {                                                                                                                //如果整数部分为0
  46.                         integerLine = "";                                                                                                                                        //将整数部分置位空串
  47.                       }
  48.             }
  49.             
  50.             //判断有没有超出转换的范围
  51.             if (integerLine.length() > iunit.length) {                                                                                                //能处理最长的长度是十六位
  52.                       System.out.println("您输入的数字过大!");
  53.                       return num;
  54.                     }
  55.             
  56.             //将整数部分和小数部分都转换为int数组
  57.             int[] integer = toArray(integerLine);                                                                                                        //将整数部分转换为int数组
  58.             int[] decimal = toArray(decimalLine);                                                                                                //将小数部分转换为int数组
  59.             
  60.             //获取整数部分的中文金额
  61.            String getChineseInteger = getChineseInteger(integer);
  62.           
  63.            //获取小数部分的中文金额
  64.            String getChineseDecimal = getChineseDecimal(decimal);
  65.             return getChineseInteger + getChineseDecimal;
  66.         }
  67.        
  68.    private static String getChineseDecimal(int[] decimal) {
  69.            StringBuffer chineseDe = new StringBuffer("");
  70.             for (int i = 0; i < decimal.length; i++) {
  71.               if (i == 3){                                                                                                                                                                                //如果小数有三为,第三位舍弃
  72.                               break;
  73.                 }
  74.               chineseDe.append(decimal[i] == 0 ? "" : (chNum[decimal[i]] + dunit[i]));                                //同整数部分一样添加单位和转换为中文数字
  75.             }
  76.             return chineseDe.toString();
  77.         }

  78. private static String getChineseInteger(int[] integer) {
  79.            StringBuffer chineseIn = new StringBuffer("");                                                        //创建一个StringBuffer来存储转换后的金额,因为Stringbuffer有添加功能
  80.             int len = integer.length;                                                                                                        //获取传入金额数组的长度
  81.             /*
  82.              * 分析:
  83.              * 1.遍历数组,对每一个数字进行判断,并且声明一个String变量用于存储单位
  84.              * 2.如果说等于integer[i] == 0,就进行下一步判断
  85.              * 3.考虑如果是关键的地方为0,例如万,十万等等,就要做相应判断,看需要加哪个单位
  86.              * 4.如果不为0,就将对应的中文添加到String字符串
  87.              * 5.最后将Stringbuffer转换为字符串返回
  88.              */
  89.             for (int i = 0; i < len; i++) {
  90.               String s = "";
  91.               if (integer[i] == 0) {                                                                                                                //判断匹配上0才进入下层判断
  92.                 if ((len - i) == 13)                                                                                                                //len - i == 13,说明这是在万(亿)单位,接着把万单位放在String变量中
  93.                   s = iunit[4];
  94.                 else if ((len - i) == 9)                                                                                                        //同上,说明是在亿单位
  95.                   s = iunit[8];
  96.                 else if ((len - i) == 5/* && b*/)                                                                                        // 万(不必填)
  97.                   s = iunit[4];
  98.                 else if ((len - i) == 1)                                                                                                        //如果出现关键单位,就用零代替,例如万,十万....
  99.                   s = iunit[0];
  100.                 if ((len - i) > 1 && integer[i + 1] != 0)                                                                //如果遇到0就补上一个零,不包含最后一位
  101.                   s += chNum[0];
  102.               }
  103.               chineseIn.append(integer[i] == 0 ? s : (chNum[integer[i]] + iunit[len - i - 1]));                                //如果匹配不是0,就用将中文字符添加到新定义的StringBuffer字符串
  104.             }
  105.             return chineseIn.toString();                                                                                                //最后返回一个字符串,用到Stringbuffer中的toString()方法
  106.         }
  107.    

  108.         private static int[] toArray(String s) {
  109.             int[] arr = new int[s.length()];                                                                                                                //创建一个和传入的字符串等长度的数组
  110.             for (int i = 0; i < arr.length; i++) {                                                                                                        //遍历数组
  111.                         arr[i] = Integer.parseInt(s.substring(i, i + 1));                                                                        //从字符串中第一个字符开始往数组中添加
  112.                 }
  113.             return arr;
  114.     }
  115.    
  116. }
复制代码

注释已经写在代码后了,希望大家能看懂我写的注释




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