A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 dqzg12300 于 2012-10-27 09:15 编辑

这个题目是之前基础测试中的一个。把2012年10月10日转换成,二零一二年十月十日。我感觉貌似能用枚举来实现。不过我用枚举不熟悉,用的switch做的。这个可以用枚举做么?有其他的解决办法吗?下面是代码
static void Main(string[] args)
        {
            string date = "2011年ê6月?4日?";
            string Num = num(date);
            Console.WriteLine(Num);
            Console.ReadKey();
        }
        static string num(string val)
        {
            string year = "";
            foreach (char c in val.ToCharArray())
            {
                switch (c)
                {
                    case '0':
                        year += "零?";
                        break;
                    case '1':
                        year += "一?";
                        break;
                    case '2':
                        year += "二t";
                        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;

11 个回复

正序浏览
郑鹏 发表于 2012-10-28 10:35
亲!晒一晒我的方法!大家一起学习喽!

class Program

这方法还是没能解决日期不合理的问题,比如平年的2月没有29,每月最大不会超过30,超过10的数,应该另行判断,11不会是一一,而是十一。这题目陷阱很多。如果你想出更好的办法,欢迎到五期区讨论http://bbs.itheima.com/thread-29531-1-1.html
回复 使用道具 举报
郑鹏 中级黑马 2012-10-28 10:35:20
11#
亲!晒一晒我的方法!大家一起学习喽!

class Program
    {
        static void Main(string[] args)
        {
            //题目:c#时间格式转换汉字大写 比如: “2011年6月4日” 转换成 “二零一一年六月四日”。
            Console.WriteLine("请输入yy年MM月dd日格式时间");
            string timestr = Console.ReadLine();//获取用户输入的时间字符串
            //以下是通过正则表达式将数字时间提取出来
            Regex reg = new Regex(@"(\d{4})年(\d{1,2})月(\d{1,2})日");
           MatchCollection results= reg.Matches(timestr);
           string y = null;
           string m = null;
           string d = null;
           foreach (Match result in results)
           {
               y = result.Groups[1].ToString();
               m = result.Groups[2].ToString();
               d = result.Groups[3].ToString();
           }
           Console.WriteLine(replease(y) + "年" + replease(m) + "月" + replease(d) + "日");
           Console.ReadKey();

        }
        //定义一个方法,用于将字符串中的每个数字转换成为汉字
        private static string replease(string str)
        {
            StringBuilder sb = new StringBuilder();
            foreach (char s in str)
            {
                switch (s)
                {
                    case '0': {   sb.Append('零'); break; }
                    case '1': {   sb.Append('一'); break; }
                    case '2': {   sb.Append('二'); break; }
                    case '3': {   sb.Append('三'); break; }
                    case '4': {   sb.Append('四'); break; }
                    case '5': {   sb.Append('五'); break; }
                    case '6': {   sb.Append('六'); break; }
                    case '7': {   sb.Append('七'); break; }
                    case '8': {   sb.Append('八'); break; }
                    case '9': {   sb.Append('九'); break; }
                    default: { break; }

                }         
            }
            return sb.ToString();

        }

    }

回复 使用道具 举报
罗代势 发表于 2012-10-27 23:49
我觉得你们没有考虑到是让用户输入,如:2012年10月27日,大写:二零一二年十月二十七日!!!!没有十~三 ...

我修改后的解法还是有问题的,不能把10识别为十,15识别为十五等。我已经写了另外一篇帖子,希望你能贴出你的代码,大家探讨一下。http://bbs.itheima.com/forum.php ... mp;extra=#pid173726
回复 使用道具 举报
罗代势 发表于 2012-10-27 23:49
我觉得你们没有考虑到是让用户输入,如:2012年10月27日,大写:二零一二年十月二十七日!!!!没有十~三 ...

我做好了,你看看还有什么问题。
  1. static void Main(string[] args)
  2. { Console.WriteLine("请输入一个日期");
  3. string dateTime = Console.ReadLine();
  4. string[] newDateTime = dateTime.Split(new string[] { "年","月","日" }, StringSplitOptions.RemoveEmptyEntries);
  5. //将输入的字符串按年月日分割,如2011年10月80日,则变成{2011,10,80}
  6. try
  7. {
  8. int year = int.Parse(newDateTime[0]);
  9. int month = int.Parse(newDateTime[1]);
  10. int day = int.Parse(newDateTime[2]);
  11. //声明数组,存放每月的天数,第一行存闰年,第二行存平年
  12. int[,] day_tabnew = new int[2, 13] { { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, }, { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, } };
  13. int lp = year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ? 1 : 0;//*判定year为闰年还是平年,lp=0为平年,非0为闰年*/
  14. if (day > day_tabnew[lp, month])//取出对应年月的天数,并与用户输入的天数做对比1
  15. {
  16. Console.WriteLine("不存在该日期");
  17. }
  18. else
  19. {
  20. //这里的可以用其他方法代替,求其他同学贴出自己的解法
  21. dateTime = dateTime.Replace("0", "零");
  22. dateTime = dateTime.Replace("1", "一");
  23. dateTime = dateTime.Replace("2", "二");
  24. dateTime = dateTime.Replace("3", "三");
  25. dateTime = dateTime.Replace("4", "四");
  26. dateTime = dateTime.Replace("5", "五");
  27. dateTime = dateTime.Replace("6", "六");
  28. dateTime = dateTime.Replace("7", "七");
  29. dateTime = dateTime.Replace("8", "八");
  30. dateTime = dateTime.Replace("9", "九");
  31. Console.WriteLine(dateTime);
  32. }
  33. }
  34. catch (Exception)
  35. {
  36. Console.WriteLine("请输入正确格式的日期,如2011年6月4日");
  37. }
  38. Console.ReadKey();
  39. }
复制代码
运行效果图:

回复 使用道具 举报
罗代势 发表于 2012-10-27 23:49
我觉得你们没有考虑到是让用户输入,如:2012年10月27日,大写:二零一二年十月二十七日!!!!没有十~三 ...

额,这是因为题目说明了:注意:不用考虑闰年,一年按365天计算,每月按30天算。所以我们就没想那么多,你一提醒,我倒是明白了,看来这题没这么简单。有空再细化一下
回复 使用道具 举报
我觉得你们没有考虑到是让用户输入,如:2012年10月27日,大写:二零一二年十月二十七日!!!!没有十~三十!!!
回复 使用道具 举报
想到用数组的遍历:
static void Main(string[] args)
        {
            string str = "2011年6月4日";
            string[] Arr = new string[9];

            for (int i = 0; i < str.Length; i++)
            {
                Arr[i] = str.Substring(i, 1);
                string temp = "";
                switch (Arr[i])
                {
                    case "0":
                        temp = "零";
                        break;
                    case "1":
                        temp = "一";
                        break;
                    case "2":
                        temp = "二";
                        break;
                    case "3":
                        temp = "三";
                        break;
                    case "4":
                        temp = "四";
                        break;
                    case "5":
                        temp = "五";
                        break;
                    case "6":
                        temp = "六";
                        break;
                    case "7":
                        temp = "七";
                        break;
                    case "8":
                        temp = "八";
                        break;
                    case "9":
                        temp = "九";
                        break;
                    default:
                        temp = Arr[i];
                        break;
                }
                Console.Write(temp);
            }
            Console.Read();
        }
回复 使用道具 举报
本帖最后由 李行周 于 2012-10-26 22:39 编辑

namespace for01
{
    class Program
    {
        static void Main(string[] args)
        {
            
            string st = (Console.ReadLine());
            string[] sq = st.Split(new char[2] { '.', '-' });//对字符串进行数组分隔
            for (int i = 0; i < sq.Length; i++)
            {
                sq=zhuanhuan.result(sq);//调用转换函数
            }
            switch (sq.Length)
            {
                case 1:
                    Console.WriteLine(sq[0] + "年" );
                    break;
                case 2:
                    Console.WriteLine(sq[0] + "年" + sq[1] + "月" );
                    break;
                case 3:
                    Console.WriteLine(sq[0] + "年" + sq[1] + "月" + sq[2] + "日");
                    break;
                default: Console.WriteLine("您输入的格式不正确");
                    break;
            }
           
                Console.ReadKey();
         
        }
        
    }

  public class zhuanhuan
    {
        public static string result(string str2)
        {
            string[] str = new string[] { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
            string st=null;
            for (int i = 0; i < str2.Length; i++)
            {               
            st+=str[Convert.ToInt32(str2.Substring(i, 1))];//调用对应的数字
            }
            return st;
        }
    }
没有使用纠错方式,没有进行数据检查,只是写了个单纯的数字转换
回复 使用道具 举报
这种解决办法也不错。看起来清晰些
回复 使用道具 举报
没用到枚举,但看你的帖子,就试用了一下,发现还是不能把问题简单化。贴一下我做的代码,如果想追求简洁的话,还有更好的办法,不过懒惰了,就浅尝辄止了。
  1. string datetime = "2011年6月4日";
  2. //分别将datetime中的阿拉伯数字替换为汉字
  3. datetime = datetime.Replace("0", "零");
  4. datetime = datetime.Replace("1", "一");
  5. datetime = datetime.Replace("2", "二");
  6. datetime = datetime.Replace("3", "三");
  7. datetime = datetime.Replace("4", "四");
  8. datetime = datetime.Replace("5", "五");
  9. datetime = datetime.Replace("6", "六");
  10. datetime = datetime.Replace("7", "七");
  11. datetime = datetime.Replace("8", "八");
  12. datetime = datetime.Replace("9", "九");
  13. Console.WriteLine(datetime);
  14. Console.ReadKey();
复制代码
回复 使用道具 举报
我遇到的困惑与你相同,一起求解吧。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马