黑马程序员技术交流社区

标题: 转换日期里的数字为汉字 [打印本页]

作者: 李君言    时间: 2013-4-23 16:35
标题: 转换日期里的数字为汉字
本帖最后由 李君言 于 2013-4-24 18:08 编辑

namespace tese7
{
    class Program
    { //时间格式转换汉字大写 比如: “2011年16月20日” 转换成 “二零十六年六月二十日”。
        static void Main(string[] args)
        {
            char[] hanzi = { '零', '一', '二', '三', '四', '五', '六', '七', '八', '九' };
            char[] shuzi = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };//定义两个数组用于对比
            string riqi = "2011年16月20日";// 例如日期为2011年16月20日
            int nian = 0;//判断“年”字出现在第几个字符
            for (int a = 0; a < riqi.Length; a++)
            {
                if (riqi[a] == '年')
                {
                    nian = a;
                }
            }
            int yue = 0;//判断“月”和“年”的距离
            for (int a = nian; a < riqi.Length; a++)
            {
                if (riqi[a] == '月')
                {
                    yue = a - nian;
                }
            }
            int ri = 0;//判断“日”和“月”的距离
            for (int a = nian + yue; a < riqi.Length; a++)
            {
                if (riqi[a] == '日')
                {
                    ri = a - (nian + yue);
                }
            }
            //分别把年月日提取出来
            //把年提取出来
            char[] year = new char[nian];
            for (int a = 0; a < nian; a++)
            {
                for (int b = 0; b < shuzi.Length; b++)
                {
                    if (riqi[a] == shuzi)
                    {
                        year[a] = hanzi;
                    }
                }
            }
            //把月提取出来,以年月之间的距离为断点;当年和月的距离大于2,说明月份是两位数
            int m = 0;
            char[] moont = new char[yue];
            for (int a = nian; a < nian + yue; a++)
            {
                for (int b = 0; b < shuzi.Length; b++)
                {
                    if (riqi[a] == shuzi && ((yue > 2 && riqi[a] == '1') && m < 1))//当月份第一位数为一个时候
                    {
                        moont[m] = '十';
                        m++;
                    }
                    else if (riqi[a] == shuzi && ((yue > 2 && riqi[a] != '0') && m < 1))//当月份是两位且没有零时情况一
                    {
                        moont[m] = hanzi;
                        m++;
                        moont[m] = '十';
                        m++;
                    }
                    else if (riqi[a] == shuzi && ((yue > 2 && riqi[a] != '0') && m == 2))//当月份是两位且没有零时,情况二
                    {
                        moont[m] = hanzi;
                    }
                    else if (riqi[a] == shuzi && (yue > 2 && riqi[a] == '0'))//当月份是两位有零时,因为之前已经赋值了一个十
                    {
                        break;
                    }
                    else if (riqi[a] == shuzi) //当月数的单数时
                    {
                        moont[m] = hanzi;
                    }
                }
            }
            //把日 提取出来,当月和日的距离大于2,说明月份是两位数
            m = 0;
            char[] day = new char[ri];
            for (int a = nian + ri + 1; a < riqi.Length; a++)
            {
                for (int b = 0; b < shuzi.Length; b++)
                {
                    if (riqi[a] == shuzi && ((ri > 2 && riqi[a] == '1') && m < 1))//当月份第一位数为一个时候
                    {
                        day[m] = '十';
                        m++;
                    }
                    else if (riqi[a] == shuzi && ((ri > 2 && riqi[a] != '0') && m < 1))//当月份是两位且没有零时情况一
                    {
                        day[m] = hanzi;
                        m++;
                        day[m] = '十';
                        m++;
                    }
                    else if (riqi[a] == shuzi && ((ri > 2 && riqi[a] != '0') && m == 2))//当月份是两位且没有零时,情况二
                    {
                        day[m] = hanzi;
                    }
                    else if (riqi[a] == shuzi && (ri > 2 && riqi[a] == '0'))//当月份是两位有零时,因为之前已经赋值了一个十
                    {
                        break;
                    }
                    else if (riqi[a] == shuzi) //当月数的单数时
                    {
                        day[m] = hanzi;
                    }
                }
            }
            //输出的时候把后面没有赋值的,数组里面的字符不输出
            for (int i = 0; i < year.Length; i++)
            {
                Console.Write(year);
            }
            Console.Write("年");
            for (int i = 0; i < moont.Length; i++)
            {
                if (moont != 0)
                    Console.Write(moont);
            }
            Console.Write("月");
            for (int i = 0; i < day.Length; i++)
            {
                if (day != 0)
                    Console.Write(day);
            }
            Console.Write("日");

            Console.ReadKey();
        }
    }
}

上面的代码是我写,知识有限目前只能这样,不知道有没有更好的思路,大家分享下,谢谢!!!

作者: 吴冕    时间: 2013-4-23 20:39
你写的还OK 啊!想要更少的代码写这个函数?
作者: 李君言    时间: 2013-4-23 22:12
吴冕 发表于 2013-4-23 20:39
你写的还OK 啊!想要更少的代码写这个函数?

是啊,想看看有没有什么更好的思路和更简单的方法
作者: 何图    时间: 2013-4-24 18:12
我做过一道题是将 2011年2月16日转换为汉子版的"二零一一年二月十六日"我是这样写的
  1. //编写一个函数进行日期转换,将输入的中文日期转换为阿拉伯数字日期,
  2.         //比如:二零一二年十二月月二十一日要转换为2012-12-21

  3.         /**** 以下为日期转换函数 ******/
  4.         static string StringChange(string str)
  5.         {

  6.             char[] sstr = str.ToCharArray();

  7.             string newstr = "";
  8.         
  9.             for (int i = 0; i < sstr.Length; i++)
  10.             {
  11.                 switch (sstr[i])
  12.                 {
  13.                     case '零':
  14.                         sstr[i] = '0';
  15.                         break;
  16.                     case '一':
  17.                         sstr[i] = '1';
  18.                         break;
  19.                     case '二':
  20.                         sstr[i] = '2';
  21.                         break;
  22.                     case '三':
  23.                         sstr[i] = '3';
  24.                         break;
  25.                     case '四':
  26.                         sstr[i] = '4';
  27.                         break;
  28.                     case '五':
  29.                         sstr[i] = '5';
  30.                         break;
  31.                     case '六':
  32.                         sstr[i] = '6';
  33.                         break;
  34.                     case '七':
  35.                         sstr[i] = '7';
  36.                         break;
  37.                     case '八':
  38.                         sstr[i] = '8';
  39.                         break;
  40.                     case '九':
  41.                         sstr[i] = '9';
  42.                         break;
  43.                     case '十':

  44.                         break;
  45.                     case '月':
  46.                         sstr[i] = '-';
  47.                         break;
  48.                     case '年':
  49.                         sstr[i] = '-';
  50.                         break;
  51.                     case '日':

  52.                         break;

  53.                 }
  54.             }
  55.             for (int i = 0; i < sstr.Length; i++)
  56.             {
  57.                 if (sstr[i] != '十' && sstr[i] != '日')
  58.                 {
  59.                     if (sstr[i] == '-')//避免'--'
  60.                     {
  61.                         
  62.                         if(sstr[i+1]=='-')
  63.                         {
  64.                             continue;
  65.                         }

  66.                     }
  67.                     sstr[i].ToString();
  68.                     newstr = newstr + sstr[i].ToString();
  69.                 }

  70.             }
  71.             
  72.             return newstr;
  73.         }


  74.         static void Main(string[] args)
  75.         {
  76.             string str = "二零一二年十二月月二十一日";
  77.             string newstr = StringChange(str);
  78.             Console.WriteLine(newstr);
  79.             
  80.             Console.ReadKey();
  81.         }
复制代码

作者: 何图    时间: 2013-4-24 18:13
遇到日和十就跳过没有处理




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