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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 许大虾 中级黑马   /  2013-6-11 15:10  /  3847 人查看  /  20 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

写一个函数进行日期转换,将输入的中文日期转换为阿拉伯数字日期,比如:二零一二年十二月月二十一日要转换为2012-12-21   顺便给个注释

20 个回复

倒序浏览
把汉字日期弄成char 数组 用字典将汉字转换成 阿拉伯数字 年月转换成 “-" 日 转换成”“
回复 使用道具 举报
public static string dateConvert(string cDate)
        {
            string aDate;//定义一个字符串为返回值 阿拉伯数字日期
            //定义字符数组存储中国数字写法
            char[] cNumber = { '零', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十' };
            //定义字符数组存储对应的阿拉伯数字写法  由于没有‘十’,所以‘十’暂时用‘*’标记   
            char[] aNumber = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '*' };
            //得到参数用年月日切分为三段放假字符串数组
            string[] cNum = cDate.Split(new string[] { "年", "月", "日" }, StringSplitOptions.RemoveEmptyEntries);
            //将第一段字符串,即年切分成字符数组
            char[] dateYear = cNum[0].ToArray();
            string dateY = "";                                           //定义一个字符串接收数字年  
            for (int i = 0; i < dateYear.Length; i++)           //遍历每一位年份汉字
            {                           
                for (int j = 0; j < cNumber.Length; j++)      //遍历每一种中文数字写法
                {
                    if (cNumber[j] == dateYear)                   //如果写法相同,则将相应的阿拉伯数字写法赋值给dateY
                    {
                        dateY += aNumber[j];
                    }
                }
            }

            //*,*2
            char[] dateMonth = cNum[1].ToArray();            //将第二段字符串,即年切分成字符数组   
            char[] dateM = new char[2];                            //创建一个月份缓冲遍历,记录被切分的中文月份
            for (int i = 0; i < dateMonth.Length; i++)          //同年份
            {
                for (int j = 0; j < cNumber.Length; j++)
                {
                    if (cNumber[j] == dateMonth)
                    {
                        dateM = aNumber[j];
                    }
                }
            }
                                                                                      //月份不同于年,会出现‘十’,分别有两种情况
            if (dateM[0] == '*' && dateM[1] == '\0')             //1 如果为‘十’月
            {
                dateM[0] = '1';                                              //将第一位改为1,第二位改为2
                dateM[1] = '0';
            }
            else if(dateM[0] == '*' && dateM[1] != '\0')         //2 如果为 '十'一月
            {
                dateM[0] = '1';                                              //将一位改为1
            }

            StringBuilder sbMonth = new StringBuilder();        //创建一个字符串拼接月份数字
            sbMonth.Append(dateM[0]);
            sbMonth.Append(dateM[1]);

            //*,*2,2*,2*1
            char[] dateDays = cNum[2].ToArray();                 //日期同月份
            char[] dateD = new char[3];
            for (int i = 0; i < dateDays.Length; i++)
            {
                for (int j = 0; j < cNumber.Length; j++)
                {
                    if (cNumber[j] == dateDays)
                    {
                        dateD = aNumber[j];
                    }
                }
            }
                                                                            //日会出现'十'的四种情况
            if (dateD[0] == '*' && dateD[1] == '\0' && dateD[2] == '\0')    // 1   '*  '
            {
                dateD[0] = '1';
                dateD[1] = '0';
            }
            else if (dateD[0] == '*' && dateD[1] != '\0' && dateD[2] == '\0')//2  ‘*2 '
            {
                dateD[0] = '1';
            }
            else if (dateD[0] != '\0' && dateD[1] == '*' && dateD[2] == '\0')//3   '2* '
            {
                dateD[1] = '0';
            }
            else if (dateD[0] != '\0' && dateD[1] == '*' && dateD[2] != '\0')//4   '2*1'
            {
                dateD[1] = dateD[2];
                dateD[2] = '\0';
            }

            StringBuilder sbDays = new StringBuilder(); //创建一个字符串拼接日期数字
            sbDays.Append(dateD[0]);
            sbDays.Append(dateD[1]);
            sbDays.Append(dateD[2]);

            aDate = dateY + '-' + sbMonth + '-' + sbDays;//拼接阿拉伯数字年份
            aDate = aDate.Replace("\0", "");              //由于拼接问题,去除"\0"
            return aDate;

        }


           水平太差了 随意写了一大串东西,求大神写个简易版

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 无__畏 于 2013-6-11 20:37 编辑

............
回复 使用道具 举报
  1. <p>主要是处理“十”的问题:
  2.             //1.*月十日;==>10
  3.             //2.*月十三日; ==>1dict[key]
  4.             //3.*月二十三日;==>不翻译 ""
  5.             //4.*月三十日;==>dict[key]0
  6.             //4中情况对“十”的不同翻译。1→10;2→1;3→不变;4→0
  7.             //测试数据:二零一二年十二月二十一日、二零零九年七月九日、
  8.             //二零一零年十月二十四日、二零一零年十月二十日</p><p>键值对集合,的键不能重复。</p><p>string str = "1壹 2贰 3叁 4肆 5伍 6陆 7柒 8捌 9玖 0零";
  9. string ziDian = "零0 一1 二2 三3 四4 五5 六6 七7 八8 九9";


  10. using System;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Text;

  14. namespace Dictionary日期转换
  15. {
  16.     class Program1
  17.     {
  18.         static void Main(string[] args)
  19.         {
  20.             Console.WriteLine("请输入一个中文日期:");
  21.             string date = Console.ReadLine();
  22.             date = ChangeDate(date);
  23.             Console.WriteLine(date);
  24.             Console.ReadKey();
  25.         }

  26.         static string ChangeDate(string date)
  27.         {
  28.             //初始化集合。
  29.             #region
  30.             Dictionary<char, char> dict = new Dictionary<char, char>();
  31.             string str = "1一 2二 3三 4四 5五 6六 7七 8八 9九 0零";
  32.             string[] info = str.Split(' ');
  33.             for (int i = 0; i < info.Length; i++)
  34.             {
  35.                 dict.Add(info[i][1], info[i][0]);
  36.             }
  37.             #endregion
  38.             //转换
  39.             //二零一一年九月八日
  40.             StringBuilder sb = new StringBuilder();
  41.             //日期中包括“十”的情况
  42.             if (date.Contains("十"))
  43.             {
  44.                 #region
  45.                 for (int i = 0; i < date.Length; i++)
  46.                 {
  47.                     if (date[i] == '十')
  48.                     {
  49.                         //4种情况
  50.                         // 1.*月十日;
  51.                         if (!dict.ContainsKey(date[i - 1]) && !dict.ContainsKey(date[i + 1]))
  52.                         {
  53.                             sb.Append("10");
  54.                         }
  55.                         else if (!dict.ContainsKey(date[i - 1]) && dict.ContainsKey(date[i + 1]))
  56.                         {
  57.                             //2.*月十三日;
  58.                             sb.Append("1");
  59.                         }
  60.                         else if (dict.ContainsKey(date[i - 1]) && dict.ContainsKey(date[i + 1]))
  61.                         {
  62.                             // 3.*月二十三日;
  63.                             // sb.Append("");
  64.                         }
  65.                         else if (dict.ContainsKey(date[i - 1]) && !dict.ContainsKey(date[i + 1]))
  66.                         {
  67.                             //4.*月三十日;
  68.                             sb.Append("0");
  69.                         }
  70.                     }
  71.                     else
  72.                     {
  73.                         if (dict.ContainsKey(date[i]))
  74.                         {
  75.                             //根据中文数字,从集合中找到阿拉伯数字,然后拼接到StringBuilder中。
  76.                             sb.Append(dict[date[i]]);
  77.                         }
  78.                         else
  79.                         {
  80.                             sb.Append(date[i]);
  81.                         }
  82.                     }
  83.                 }
  84.                 #endregion
  85.             }
  86.             else
  87.             {
  88.                 //不包括的“十”的情况。
  89.                 #region
  90.                 for (int i = 0; i < date.Length; i++)
  91.                 {
  92.                     if (dict.ContainsKey(date[i]))
  93.                     {
  94.                         //根据中文数字,从集合中找到阿拉伯数字,然后拼接到StringBuilder中。
  95.                         sb.Append(dict[date[i]]);
  96.                     }
  97.                     else
  98.                     {
  99.                         sb.Append(date[i]);
  100.                     }
  101.                 }
  102.                 #endregion
  103.             }
  104.             return sb.ToString();
  105.         }
  106.     }
  107. }







  108. </p>
复制代码

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
  1. namespace 转换
  2. {
  3.     class Program
  4.     {
  5.         static void Main(string[] args)
  6.         {
  7.             //C#时间格式转换成汉字大写比如:2009年9月5日 转换成二零零九年九月五日
  8.             //输入字符串,返回字符串
  9.             string date = Console.ReadLine();            
  10.             Console.WriteLine(ToCH(date));
  11.             Console.ReadKey();
  12.         }

  13.         static string ToCH(string date)
  14.         {
  15.             char[] chars = date.ToCharArray();     //将字符串转换成一个字符数组
  16.             for (int i = 0; i < chars.Length; i++) //遍历字符数组
  17.             {                 
  18.                 switch (chars[i])
  19.                 {
  20.                     case '1':
  21.                         chars[i] = '一';
  22.                         break;
  23.                     case '2':
  24.                         chars[i] = '二';
  25.                         break;
  26.                     case '3':
  27.                         chars[i] = '三';
  28.                         break;
  29.                     case '4':
  30.                         chars[i] = '四';
  31.                         break;
  32.                     case '5':
  33.                         chars[i] = '五';
  34.                         break;
  35.                     case '6':
  36.                         chars[i] = '六';
  37.                         break;
  38.                     case '7':
  39.                         chars[i] = '七';
  40.                         break;
  41.                     case '8':
  42.                         chars[i] = '八';
  43.                         break;
  44.                     case '9':
  45.                         chars[i] = '九';
  46.                         break;
  47.                     case '0':
  48.                         chars[i] = '零';
  49.                         break;
  50.                 }
  51.             }

  52.             date = new string(chars);
  53.             return date ;
  54.         }
  55.     }
  56. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报 0 1

如果输入的 2009年10月20日,就会输出 二零零九年一零月二零日   不要偷工减料啊!
回复 使用道具 举报
本帖最后由 无__畏 于 2013-6-11 22:40 编辑
  1. string cNumber = "零一二三四五六七八九";
  2.             char[] aNumber = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
  3.             string str = "二零一二年十月二十一日";
  4.             string newStr = "";
  5.             int m = 0;
  6.             foreach (char item in str)
  7.             {
  8.                 int n = cNumber.IndexOf(item);
  9.                 if (item == '年' || item == '月' || item == '日')
  10.                 {
  11.                     if (item == '日')
  12.                     {
  13.                         m++;
  14.                         continue;
  15.                     }
  16.                     newStr += "-";
  17.                     m++;
  18.                     continue;
  19.                 }
  20.                 if (item == '十')
  21.                 {
  22.                     if ((str[m + 1] == '月' || str[m + 1] == '日') && (str[m - 1] == '年' || str[m - 1] == '月'))
  23.                     {
  24.                         newStr += "10";
  25.                     }
  26.                     else if (str[m + 1] == '月' || str[m + 1] == '日')
  27.                     {
  28.                         newStr += "0";
  29.                     }
  30.                     else if (str[m - 1] == '年' || str[m - 1] == '月')
  31.                     {
  32.                         newStr += "1";
  33.                     }
  34.                     m++;
  35.                     continue;
  36.                 }
  37.                 m++;
  38.                 newStr += aNumber[n];
  39.             }
  40.             Console.WriteLine(newStr);
  41.             Console.ReadKey();
复制代码

点评

?  发表于 2013-6-13 17:03

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 胡章诚 于 2013-6-11 22:09 编辑

做了半天,这个“十”真的让人好纠结啊
回复 使用道具 举报
本帖最后由 胡章诚 于 2013-6-11 22:09 编辑

sorry,发错了
回复 使用道具 举报

你的程序里面连“十”都没有转换,肯定不行啊
回复 使用道具 举报

  1. namespace convertDay
  2. {
  3.     /// <summary>
  4.     /// 写一个函数进行日期转换,将输入的中文日期转换为阿拉伯数字日期,比如:二零一二年十二月月二十一日要转换为2012-12-21   顺便给个注释
  5.     /// </summary>
  6.     class Program
  7.     {
  8.         static char[] cNumber = { '零', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十' };
  9.         static void Main(string[] args)
  10.         {



  11.             string srcDay = "二零一二年十二月二十一日";
  12.             string srcDay2 = "二零一二年十月二十日";
  13.             char[] daySplit={ '年', '月', '日' };
  14.             string[] arrDay = srcDay.Split(daySplit);
  15.             string[] arrDay2 = srcDay2.Split(daySplit);
  16.             Console.WriteLine("{0}-{1}-{2}", cYear(arrDay[0]), cMonth(arrDay[1]),cDay(arrDay[2]));
  17.             Console.WriteLine("{0}-{1}-{2}", cYear(arrDay2[0]), cMonth(arrDay2[1]), cDay(arrDay2[2]));
  18.             Console.Read();

  19.         }
  20.         public static string cYear(string num)
  21.         {
  22.             string sumYear="";
  23.             for(int j=0;j<num.Length;j++)
  24.             {
  25.                 for (int i = 0; i < 10; i++)
  26.                 {
  27.                     if (num[j] == cNumber[i])
  28.                         sumYear += i;
  29.                     
  30.                 }
  31.             }
  32.             return sumYear;
  33.         }
  34.         public static string cMonth(string num)                 //判断月份,月份不可能长度大于3,也不会出现为“一十一月”这种情况(正常思维)
  35.         {
  36.             string sumMonth = "";
  37.             if (num.Length < 2)                                
  38.             {
  39.                 if (num == "十")                                 //先判断10月
  40.                 {
  41.                    return sumMonth = "10";
  42.                     
  43.                 }
  44.                 for (int j = 0; j < num.Length; j++)             //小于10月,那么就是直接兑换就可。。
  45.                 {
  46.                     for (int i = 0; i < 10; i++)
  47.                     {
  48.                         if (num[j] == cNumber[i])
  49.                             sumMonth += i;

  50.                     }
  51.                 }
  52.                 return sumMonth;
  53.             }
  54.             else
  55.             {
  56.                 for (int j = 0; j < num.Length; j++)            //月份没有“二十一月”这种情况,所以,大于10月的直接过滤“十”,转换结果前加“1”
  57.                 {
  58.                     for (int i = 0; i < 10; i++)
  59.                     {
  60.                         if (num[j] == cNumber[i])
  61.                             sumMonth += i;

  62.                     }
  63.                 }
  64.                 return "1" + sumMonth;
  65.             }

  66.         }
  67.         public static string cDay(string num)
  68.         {
  69.             string sumDay = "";
  70.             if (num.Length < 2)                                     //个位数“day”
  71.             {
  72.                 for (int j = 0; j < num.Length; j++)
  73.                 {
  74.                     for (int i = 0; i < 10; i++)
  75.                     {
  76.                         if (num[j] == cNumber[i])
  77.                             sumDay += i;

  78.                     }
  79.                 }
  80.                 return sumDay;
  81.             }
  82.             else if (num.Length == 2)                               //两位数"day",需解析“十”  |"十"存在两个位置,一个是首,一个是尾。
  83.             {
  84.                 if(num[0]=='十')
  85.                 {
  86.                 for (int j = 0; j < num.Length; j++)
  87.                 {
  88.                     for (int i = 0; i < 10; i++)
  89.                     {
  90.                         if (num[j] == cNumber[i])
  91.                             sumDay += i;

  92.                     }
  93.                 }
  94.                 return "1" + sumDay;
  95.             }
  96.             else
  97.                 {
  98.                   for (int j = 0; j < num.Length; j++)
  99.                   {
  100.                         for (int i = 0; i < 10; i++)
  101.                         {
  102.                             if (num[j] == cNumber[i])
  103.                                 sumDay += i;

  104.                         }
  105.                     }
  106.                       return  sumDay+"0";
  107.                     }
  108.             }
  109.             else
  110.             {
  111.                 for (int j = 0; j < num.Length; j++)            //三位数,不需解析“十”;
  112.                 {
  113.                     for (int i = 0; i < 10; i++)
  114.                     {
  115.                         if (num[j] == cNumber[i])
  116.                             sumDay += i;

  117.                     }
  118.                 }
  119.                 return sumDay;
  120.             }

  121.         }
  122.             
  123.     }
  124. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报

图样图森破啊

错了.jpg (20.2 KB, 下载次数: 0)

错了.jpg
回复 使用道具 举报

少了个判断  再看
回复 使用道具 举报
用0代表10吧。。
回复 使用道具 举报
胡章诚 发表于 2013-6-11 22:11
你的程序里面连“十”都没有转换,肯定不行啊

之前没考虑十 呵呵:D  我修改了
回复 使用道具 举报
  1. 我修改了一下,没做日期是否合法,那不是重点

  2. namespace 日期转换
  3. {
  4.     class Program
  5.     {
  6.         static void Main(string[] args)
  7.         {

  8.             //C#时间格式转换成汉字大写比如:2009年9月5日 转换成二零零九年九月五日
  9.             //输入字符串,返回字符串
  10.             string date = Console.ReadLine().Trim();
  11.             Console.WriteLine(ToCH(date));
  12.             Console.ReadKey();
  13.         }

  14.         //方法
  15.         static string ToCH(string date)
  16.         {
  17.             //处理月 日 两位数的情况
  18.             string[] datePart = date.Split(new char[] { '年', '月', '日' }, StringSplitOptions.RemoveEmptyEntries);

  19.             int mon = int.Parse(datePart[1]);//月 转换成数字,消除03,04的情况
  20.             int day = int.Parse(datePart[2]);//日 同理

  21.             //十 的情况  月
  22.             if (mon >= 10)
  23.             {
  24.                 if (mon == 10)
  25.                 {
  26.                     datePart[1] = "十";
  27.                 }
  28.                 else
  29.                     datePart[1] = "十" + mon % 10;
  30.             }
  31.             else
  32.             {
  33.                 datePart[1] = mon.ToString();
  34.             }

  35.             //十 的情况  日
  36.             if (day >= 10)
  37.             {
  38.                 if (day % 10 == 0)
  39.                 {
  40.                     if (day == 10)
  41.                     {
  42.                         datePart[2] = "十";
  43.                     }
  44.                     else
  45.                         datePart[2] = day / 10 + "十";
  46.                 }
  47.                 else
  48.                 {
  49.                     datePart[2] = day / 10 + "十" + day % 10;
  50.                 }
  51.             }
  52.             else
  53.             {
  54.                 datePart[2] = day.ToString();
  55.             }
  56.             //拼成新的日期字符串
  57.             string newDate = datePart[0] + "年" + datePart[1] + "月" + datePart[2] + "日";

  58.             char[] dateChars = newDate.ToArray();//得到char[]

  59.             for (int i = 0; i < dateChars.Length; i++) //遍历
  60.             {
  61.                 switch (dateChars[i])
  62.                 {
  63.                     case '1':
  64.                         dateChars[i] = '一';
  65.                         break;
  66.                     case '2':
  67.                         dateChars[i] = '二';
  68.                         break;
  69.                     case '3':
  70.                         dateChars[i] = '三';
  71.                         break;
  72.                     case '4':
  73.                         dateChars[i] = '四';
  74.                         break;
  75.                     case '5':
  76.                         dateChars[i] = '五';
  77.                         break;
  78.                     case '6':
  79.                         dateChars[i] = '六';
  80.                         break;
  81.                     case '7':
  82.                         dateChars[i] = '七';
  83.                         break;
  84.                     case '8':
  85.                         dateChars[i] = '八';
  86.                         break;
  87.                     case '9':
  88.                         dateChars[i] = '九';
  89.                         break;
  90.                     case '0':
  91.                         dateChars[i] = '零';
  92.                         break;
  93.                 }
  94.             }
  95.             date = new string(dateChars);
  96.             return date;
  97.         }
  98.     }
  99. }
复制代码

点评

跟题目不一样!!!  发表于 2013-6-13 17:03
回复 使用道具 举报
274997322 发表于 2013-6-11 21:18
如果输入的 2009年10月20日,就会输出 二零零九年一零月二零日   不要偷工减料啊! ...

哈哈,没考虑十的情况,刚才修改了一下
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马