黑马程序员技术交流社区

标题: 关于20121111转二零一二年十一月十一月重做 [打印本页]

作者: dqzg12300    时间: 2012-10-30 01:36
标题: 关于20121111转二零一二年十一月十一月重做
本帖最后由 dqzg12300 于 2012-10-30 01:53 编辑

测试完毕。没有问题,我把年月日分开处理。至于效率嘛,懒得测试了。
不过结果还是正确的。10月份以后也正常显示。10日以后的也都正常了。注释就不写了。相信大家一看就懂了
效果图如下:

         static void Main(string[] args)
        {
            Console.Write("请输入一个日期:");
            string date = Console.ReadLine();
            string yearing = "";
            string month = "";
            string day = "";
            if (date.Length == 8)
            {
                yearing = year(date.Substring(0, 4));
                int month_int = Convert.ToInt32(date.Substring(4, 2));
                if (month_int > 12)
                {
                    Console.WriteLine("月份输入错误!");
                    return;
                }
                switch (month_int)
                {
                    case 10:
                        month = "十";
                        break;
                    case 11:
                        month = "十一";
                        break;
                    case 12:
                        month = "十二";
                        break;
                    default:
                        month = year(month_int.ToString());
                        break;
                }
                string str = date.Substring(6, 2);
                int day_int = Convert.ToInt32(str);
                if (day_int < 10)
                {
                     day = year(str);
                }
                else
                {
                    string day1 = day_int.ToString().Substring(0, 1);
                    switch (day1)
                    {
                        case "1":
                            day = "十";
                            break;
                        case "2":
                            day = "二十";
                            break;
                        case "3":
                            day = "三十";
                            break;
                    }
                    day += year(day_int.ToString().Substring(1, 1));
                }
            }
            Console.WriteLine(yearing +"年"+ month +"月"+ day+"日");
        }
        static string year(string str)
        {
            string year = "";
            foreach (char c in str.ToCharArray())
            {
                switch (c)
                {
                    case '0':
                        if (str.Length > 2)
                        {
                            year += "零";
                        }
                        break;
                    case '1':
                        year += "一";
                        break;
                    case '2':
                        year += "二";
                        break;
                    case '3':
                        year += "三";
                        break;
                    case '4':
                        year += "四?";
                        break;
                    case '5':
                        year += "五";
                        break;
                    case '6':
                        year += "六";
                        break;
                    case '7':
                        year += "七";
                        break;
                    case '8':
                        year += "八";
                        break;
                    case '9':
                        year += "九";
                        break;
                    default:
                        year += c.ToString();
                        break;
                }
            }
            return year;
        }
   

作者: 李建强    时间: 2012-10-30 11:27
查表法可以简化代码。
作者: dqzg12300    时间: 2012-10-30 12:10
求楼上放出简化代码。我觉得我的思路还可以,分开单独处理,然后重复利用
作者: 郑鹏    时间: 2012-10-30 12:45
你这个挺好的,比我想的好
作者: dqzg12300    时间: 2012-10-30 13:44
我比较想知道李健强的查表法,看下过程
作者: 欧玉斌    时间: 2012-10-30 15:48
本帖最后由 幻想领域 于 2012-10-30 17:08 编辑

这个问题大家讨论很久了(黑马的学习氛围就是好)。
刚我改了一下自己的代码,把完整的功能实现了。代码还算简洁,只有四十行
包括:判断日期错误(如输入2011年2月29(平年2月无29),月份大于12,日期大于31);
十以上月份日期转换。
主要用到datetime类(可以自动判断日期是否合理),数组(存储月份、日期包括大于十的值),replace函数(字符串替换)、
StringBuilder可变字符串存年份信息
实现思路:
1、获取日期,并在try内将其转换为dateTime类型,如果日期错误(如输入2011年2月29,月份大于12,日期大于31,则跳到catch提示错误)
2、根据年月日分割日期,注意不能用yyyy年MM月dd日,否则输入2年1月1日时,转换成2002年01月01日,将影响效果
3、根据Replaceyear转换年份(遍历年份的每一个项,将数组对应的汉字追加到str)
4、根据ReplaceMonthAndDay转换月日,将数字替换为数组对应的汉字。
  1. static void Main(string[] args)
  2. {
  3. Console.WriteLine("请输入yy年MM月dd日格式时间");
  4. string dateTime = Console.ReadLine();
  5. try
  6. {
  7. //使用datetime转换,如果日期错误(如输入2011年2月29,月份大于12,日期大于31,则跳到catch提示错误)
  8. DateTime dt = DateTime.Parse(dateTime);
  9. //根据年月日分割日期,注意不能用yyyy年MM月dd日,否则输入2年1月1日时,转换成2002年01月01日,将影响效果
  10. string[] newDateTime = dt.ToString("y年M月d日").Split(new string[] { "年", "月", "日" }, StringSplitOptions.RemoveEmptyEntries);
  11. string newYear = Replaceyear(newDateTime[0]);//转换年
  12. string month = ReplaceMonthAndDay(newDateTime[1]);//转换月份
  13. string day = ReplaceMonthAndDay(newDateTime[2]);//转换天
  14. Console.WriteLine("{0}年{1}月{2}日",newYear,month,day);
  15. }
  16. catch (Exception)
  17. {
  18. Console.WriteLine("输入的日期错误");
  19. }
  20. Console.ReadKey();
  21. }
  22. static string Replaceyear(string year)
  23. {
  24.      string[] y = new string[] { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
  25.      StringBuilder str =new StringBuilder();
  26.       for (int i = 0; i < year.Length; i++)
  27.       {
  28.             str.Append(y[int.Parse(year[i].ToString())]);//取出对应的汉字存到str中
  29.       }
  30.        return str.ToString();}
  31. //转换月份和日期
  32. static string ReplaceMonthAndDay(string md)
  33. {
  34. string[] rmd= new string[] {"零","一","二","三","四","五","六","七","八","九","十","十一","十二","十三","十四","十五","十六","十七","十八","十九","二十","二十一","二十二","二十三","二十四","二十五","二十六","二十七","二十八","二十九","三十","三十一"};
  35. md = md.Replace(md, rmd[int.Parse(md)]);//取出对应的汉字
  36. return md;
  37. }
复制代码

作者: 欧玉斌    时间: 2012-10-30 16:57
亚金你的解法对判断日期合法性还是有问题,最好还是让用户输入x年x月x日吧,否则如果输入2012111,系统就无法识别是2012年11月1日,还是2012年1月11日了
作者: dqzg12300    时间: 2012-10-30 22:00
我知道。if (date.Length == 8)。所以在开始的时候,我就要求客户输入的必须长度为8的日期格式了。所以用户看到就会输入20120111或者是20121101

作者: dqzg12300    时间: 2012-10-31 00:17
效率测试过了,你的办法代码减少了很多。但是效率太慢了。
我的那个处理的效率图

你的处理效率图

switch处理起来确实效率些。我的总运行时间最多的时候是2W多,计时器刻度标示是5000多。




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