黑马程序员技术交流社区

标题: 【志在云十】小写数字转大写数字 [打印本页]

作者: Mr._Strange    时间: 2014-5-20 22:35
标题: 【志在云十】小写数字转大写数字
用最基础的最简单Java知识做的一个小程序:将小写数字转换成大写数字。因为所学知识有限,只会接收键盘输入int类型,且刚学到了流程控制,所以程序不够优化,而且输入的数据只能是int类型,
其它类型运行的话就会报错,这是我目前知识比较局限所致这也是我目前所能做到的最好的了,不足之处还望大家多多指教。。。
  1. /*
  2. 需求:构造一个类,可以将10000以内的数字转换为大写数字

  3.                 如:100=壹佰        107=壹佰零柒        168=壹佰陸十捌        35=叁拾伍        7=柒        130=壹佰叁十
  4.                         1030=壹仟零叁拾

  5. 因为所学知识有限,只会接收键盘输入int类型,且刚学到了流程控制,所以程序不够优化,而且输入的数据只能是int类型,
  6. 其它类型就会报错,这是我目前知识比较局限所致这也是我目前所能做到的最好的了,不足之处还望大家多多指教。。。

  7. */

  8. import java.util.Scanner;
  9. class zhuanhuan
  10. {
  11.         public static void main(String[] args)
  12.         {
  13.                 int jishu =0;
  14.                 Scanner sc = new Scanner(System.in);//接收键盘输入
  15.         while (true)//循环执行,方便使用
  16.         {
  17.                
  18.                 System.out.println("请输入你想要转换的数字:");
  19.                 int num =sc.nextInt();
  20.                 int ge =0;
  21.                 int shi =0;
  22.                 int bai =0;
  23.                 int qian =0;
  24.                 if (num>=0&&num<=9)//拆分,将接收的数字分别为一位,两位,三位的情况下的各个位上的数字拆开
  25.                 {
  26.                         ge =num;
  27.                 }
  28.                 else if (num>=10&&num<=99)
  29.                 {
  30.                         ge =num%10;
  31.                         shi =num/10%10;
  32.                 }
  33.                 else if (num>=100&&num<=999)
  34.                 {
  35.                         ge =num%10;
  36.                         shi =num/10%10;
  37.                         bai =num/100;
  38.                 }
  39.                 else if (num>=1000&&num<=9999)
  40.                 {
  41.                         ge =num%10;
  42.                         shi =num/10%10;
  43.                         bai =num/100%10;
  44.                         qian =num/1000%10;
  45.                 }
  46.                 else System.out.println("输入数据不正确!!");//判断,如果输入数据不在范围内,则执行此句!

  47.                         if (qian>0)//判断四位数,如果千位上数大于0,则调用一次jieguo,百位,十位,个位雷同
  48.                         {
  49.                                 jieguo(qian);
  50.                                 System.out.print("仟");
  51.                                 if (!(bai==0))
  52.                                 {
  53.                                         jieguo(bai);
  54.                                         System.out.print("佰");
  55.                                 }
  56.                                 if ((bai==0)&!(shi==0))//如果百位为0,十位上不为零,则输出一个”零“
  57.                                 {
  58.                                         System.out.print("零");
  59.                                 }
  60.                                 if (!(shi==0))
  61.                                 {
  62.                                         jieguo(shi);
  63.                                 }
  64.                                 if ((shi==0)&!(ge==0))//如果十位为0,个位上不为零,则输出一个”零“
  65.                                 {
  66.                                         System.out.print("零");
  67.                                 }
  68.                        
  69.                                 if (!(shi==0))
  70.                                 {
  71.                                         System.out.print("拾");
  72.                                 }
  73.                                 if (!(ge==0))
  74.                                 {
  75.                                         jieguo(ge);
  76.                                 }
  77.                         }
  78.                         else if (bai>0)//判断三位数
  79.                         {
  80.                                 jieguo(bai);
  81.                                 System.out.print("佰");
  82.                                 if (!(shi==0))
  83.                                 {
  84.                                         jieguo(shi);
  85.                                 }
  86.                                 if ((shi==0)&!(ge==0))
  87.                                 {
  88.                                         System.out.print("零");
  89.                                 }
  90.                        
  91.                                 if (!(shi==0))
  92.                                 {
  93.                                         System.out.print("拾");
  94.                                 }
  95.                                 if (!(ge==0))
  96.                                 {
  97.                                         jieguo(ge);
  98.                                 }
  99.                         }
  100.                         else if (shi>0)//判断两位数
  101.                         {
  102.                                 jieguo(shi);
  103.                                 System.out.print("拾");
  104.                                 if (!(ge==0))
  105.                                 {
  106.                                         jieguo(ge);
  107.                                 }
  108.                         }
  109.                         else if (ge>0)//判断一位数
  110.                         {
  111.                                 jieguo(ge);
  112.                         }
  113.                 System.out.println();
  114.         }
  115.         }
  116.         public static void jieguo(int R)//把switch判断封装成一个方法jieguo
  117.         {
  118.                 int S=R;
  119.                 switch (R)
  120.                         {
  121.                         case 1:
  122.                                 System.out.print("壹");
  123.                                 break;
  124.                         case 2:
  125.                                 System.out.print("貳");
  126.                                 break;
  127.                         case 3:
  128.                                 System.out.print("叁");
  129.                                 break;
  130.                         case 4:
  131.                                 System.out.print("肆");
  132.                                 break;
  133.                         case 5:
  134.                                 System.out.print("伍");
  135.                                 break;
  136.                         case 6:
  137.                                 System.out.print("陸");
  138.                                 break;
  139.                         case 7:
  140.                                 System.out.print("柒");
  141.                                 break;
  142.                         case 8:
  143.                                 System.out.print("捌");
  144.                                 break;
  145.                         case 9:
  146.                                 System.out.print("玖");
  147.                                 break;
  148.                         }
  149.         }
  150. }
复制代码



数字小写转大写.jpg (94.58 KB, 下载次数: 36)

数字小写转大写效果

数字小写转大写效果

作者: 余翔    时间: 2014-5-20 22:38
不错不错,收藏了。
作者: Mr._Strange    时间: 2014-5-20 22:39
沙发是我自己的~~~
作者: 李小新H    时间: 2014-5-21 08:24
加油!!!
作者: Mr._Strange    时间: 2014-5-21 08:53
余翔 发表于 2014-5-20 22:38
不错不错,收藏了。

抢我沙发......{:2_31:}
作者: 屈_zi    时间: 2014-5-21 09:20
我也写了下代码,像转换类的,用一个字符串数组是很省事的做法,超过超过10w的数,想了想,觉得有点麻烦,就没写了

  1. import java.util.Scanner;

  2. public class ToChineseForm {
  3.         private static String[] num = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
  4.         private static String[] unit = {"", "拾", "佰", "仟", "万"};
  5.        
  6.         /**
  7.          * 将输入的整数转换成中文大写形式,本方法接收int型入参
  8.          * @param input
  9.          * @return
  10.          */
  11.         public static String toChineseForm(int input){       
  12.                 //将待转换的数值转换成字符串
  13.                 String n = new String(new Integer(input).toString());               
  14.                 return toChineseForm(n);
  15.         }
  16.        
  17.         /**
  18.          * 将输入的整数转换成中文大写形式,本方法接收String型入参
  19.          * @param n
  20.          * @return
  21.          */
  22.         public static String toChineseForm(String n){
  23.                 //如果是0元,这直接返回“零元”               
  24.                 if(n.equals("0")){
  25.                         return "零元";
  26.                 }
  27.                
  28.                 String ret = new String();
  29.                
  30.                 //只能转换100000以内的数
  31.                 int nLength = n.length() - 1;
  32.                 if(nLength > 4){
  33.                         return "Input is too big";
  34.                 }
  35.                
  36.                 //转换
  37.                 for(int i = 0; i <= nLength; i++){
  38.                         //获得各个位上的数值
  39.                         int spotNum = (int)n.charAt(i)-48;
  40.                         //如果存在非数字字符,则返回错误
  41.                         if(spotNum < 0 || spotNum > 9){
  42.                                 return "Input error";
  43.                         }
  44.                         //数值的大写字符加上位的大写字符(如1023为“壹仟零佰贰拾叁”,为了使之符合规则,还需要对“零进行调整”)
  45.                         ret += num[spotNum] +  unit[nLength - i];                               
  46.                 }
  47.                        
  48.                 //对字符串中的0进行调整
  49.                 boolean f = true;
  50.                 char[] rret = ret.toCharArray();
  51.                 int tag = 0;
  52.                 for(int i = rret.length - 1; i >= 0; i = i - 2){                       
  53.                         if(rret[i] != '零'){
  54.                                 //如果是第一次执行这段代码,那么f就是true,那么开始的零全都取消,如100为“壹佰零拾零”转换为“壹佰”
  55.                                 if(f){
  56.                                         f = false;
  57.                                         continue;
  58.                                 }
  59.                                 //如果并非是第一次也就是中间有多个零,那么保留一个零
  60.                                 if(rret[tag] == '0'){
  61.                                         rret[tag + 1] = '零';
  62.                                 }
  63.                         }else{       
  64.                                 //先把值为“零”的位及它的单位全部标志成0,如“壹佰零拾零”变成了“壹佰000”
  65.                                 rret[i] = '0';       
  66.                                 if(i < rret.length - 2){//第一个零没有后一位
  67.                                         rret[i + 1] = '0';
  68.                                 }
  69.                                 //记录当前为'零'的位置
  70.                                 tag = i;
  71.                         }
  72.                 }
  73.        
  74.                 //获得最后的结果,去掉字符数组中的0值
  75.                 ret = "";
  76.                 for(int i = 0; i < rret.length; i++){
  77.                         if(rret[i] != '0'){
  78.                                 ret += rret[i];
  79.                         }
  80.                 }
  81.                
  82.                 //返回前加上币值单位
  83.                 return ret + "元";
  84.         }

  85.         public static void main(String[] args) {       
  86.                 Scanner sc = new Scanner(System.in);
  87.                 System.out.println("Input num:");
  88.                 System.out.println(toChineseForm(sc.next()));               
  89.                 sc.close();
  90.                
  91.         }

  92. }
复制代码




作者: Mr._Strange    时间: 2014-5-21 09:37
屈_zi 发表于 2014-5-21 09:20
我也写了下代码,像转换类的,用一个字符串数组是很省事的做法,超过超过10w的数,想了想,觉得有点麻烦, ...

受教了{:3_57:}比我的简洁高效多了!!
作者: jsjchenlong    时间: 2014-5-21 14:14
加油加油。。。
作者: jsjchenlong    时间: 2014-5-21 15:29

加油加油。。。




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