黑马程序员技术交流社区

标题: 10、 金额转换,阿拉伯数字转换成中国传统形式 [打印本页]

作者: 李文思    时间: 2015-7-21 10:05
标题: 10、 金额转换,阿拉伯数字转换成中国传统形式
题目:如题
自己写的一段代码。思路并不是很清晰,期待能提供更清晰简洁的思路以及代码。
  1. package com.itheima;

  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;

  5. /**
  6. * 10、  金额转换,阿拉伯数字转换成中国传统形式。
  7. *                 例如:101000001010   转换为   壹仟零壹拾亿零壹仟零壹拾圆整
  8. *                            壹仟零壹拾亿零壹仟零壹拾圆整
  9. *                 答:明确我们的中国的转换方式:
  10. *                         数字有:"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"
  11. *                         单位有:"圆", "拾", "佰", "仟", "万", "拾", "佰","仟", "亿", "拾", "佰", "仟"
  12. *                 利用查表法,
  13. *                 根据所得到的数字,以该数字为角标,去查数字表格,如果该数字为零,则不去查单位。以该数字所在的角标位,去查单位表格。
  14. *                 由于在数字中得到的第一个数字是金额的最高位,所以我们将数字字符反转
  15. *                 如果是0、4、8角标位的单位,无论该数字是否为零,都必须有单位
  16. *                 最后以一定的规则对得到的中文金额进行处理.
  17. *                 本程序只能转1-12位的阿位伯整数。键盘输入要转换的数字金额,输入over结束转换
  18. *
  19. * @author liwensi
  20. *
  21. * */
  22. public class Test10 {
  23.        
  24.         public static void main(String[] args) {
  25.                 //调用inpuKey方法,从键盘接收要转换的数字
  26.                 try {
  27.                         inputKey();
  28.                 } catch (IOException e) {
  29.                         e.printStackTrace();
  30.                 }
  31.         }
  32.        
  33.         public static void inputKey () throws IOException {
  34.                 //建立转换工具的对象
  35.                 ConversionTool ct = new ConversionTool();
  36.                
  37.                 //接收键盘录入
  38.                 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  39.                 String line = null;
  40.                
  41.                 while((line = bufr.readLine()) != null) {
  42.                         //如果输入"over",则结束键盘录入
  43.                         if (line.equals("over"))
  44.                                 System.exit(0);
  45.                         //全是数字才转换。
  46.                         if (line.matches("\\d{1,12}"))
  47.                                 System.out.println(ct.conversion(line));
  48.                         else
  49.                                 System.out.println("请输入1到12位数字");
  50.                 }
  51.         }
  52. }


  53. /**
  54. * 定义一个数字金额转换成中文金额的工具*/
  55. class ConversionTool {

  56.         //将数字金额转换成中文金额
  57.         public String conversion(String str) {
  58.                 //创建两个容器用于存储阿拉伯金额,跟中文金额
  59.                 StringBuilder sb = new StringBuilder(str);
  60.                 StringBuilder newSb = new StringBuilder();
  61.                
  62.                 //对数据进行反转,以便查表。
  63.                 sb.reverse();
  64.                
  65.                 //从零角标开始,对sb容器中的元素进行操作。
  66.                 for(int x = 0 ; x < sb.length() ; x++) {                                       
  67.                         //获取该角标对应数字然后查表获取对应的中文数字
  68.                         int num = Integer.parseInt(sb.charAt(x) +"");
  69.                        
  70.                         //用该数字查表,获取中文表现形式
  71.                         String chNum = searchNumber(num);       
  72.                        
  73.                         //如果该角标位是0、4、8,则一定要获取单位,否则再判断num不等于零才获取单位
  74.                         String unit = "";
  75.                         if ((x % 4) == 0) {
  76.                                 unit = searchUnit(x);
  77.                         } else if (num != 0) {
  78.                                 unit = searchUnit(x);
  79.                         }
  80.                         //将得到的第一位数字的中文表现形式插入newSb中的开头位置
  81.                         newSb.insert(0, chNum + unit);
  82.                 }
  83.                 newSb.append("整");
  84.                 String ch = newSb.toString();
  85.                 //去除重复的多个零
  86.                 ch = ch.replaceAll("(零)+", "$1");
  87.                 //零后面不可以跟圆,万,亿
  88.                 ch = ch.replaceAll("零([圆万亿])", "$1");
  89.                 //亿后面不可以跟万
  90.                 ch = ch.replaceAll("(亿)万", "$1");
  91.                 return ch;
  92.         }
  93.         public String searchNumber(int num) {
  94.                 String[] arr = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
  95.                 return arr[num];
  96.         }
  97.        
  98.         public String searchUnit(int x) {
  99.                 String[] arr = {"圆","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟"};
  100.                 return arr[x];
  101.         }
  102. }
复制代码






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