黑马程序员技术交流社区

标题: 年份的转换 [打印本页]

作者: 李 玉林    时间: 2012-8-26 21:04
标题: 年份的转换
本帖最后由 lyl0043 于 2012-8-27 22:35 编辑

把数字年份转换成汉字年份,例如:2011年6月4日” 转换成 “二零一一年六月四日”。但存在一个双位数的月份和双位数的日期的问题,像这种2011年10月20日转换成“二零一二年十月二十日”。。。。求一个通俗易懂的做法
作者: 资建文    时间: 2012-8-26 22:52
string date = "2011
作者: 资建文    时间: 2012-8-26 22:53
string date = "2011
作者: 资建文    时间: 2012-8-26 22:53
string date = "2011年6月4日";
             date= date.Replace("2","二");
             date = date.Replace("0", "零");
             date = date.Replace("1", "一");
             date = date.Replace("6", "六");
             date = date.Replace("4", "四");
            
                Console.Write(date);
            
            Console.ReadKey();

作者: 资建文    时间: 2012-8-26 22:54
不好意思卡了下   。。就多回了  也不知道为什么只显示一句
作者: hehe04    时间: 2012-8-26 22:55
本帖最后由 hehe04 于 2012-8-26 22:57 编辑

可以在输出的时候判断  并逐个输出
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;

  4. namespace Test8
  5. {
  6.     class Program
  7.     {
  8.         //8、 c#时间格式转换汉字大写 比如: “2011年6月4日” 转换成 “二零一一年六月四日”。
  9.         static void Main(string[] args)
  10.         {
  11.             Console.WriteLine("请分别输入年、月、日:");
  12.             int a = Convert.ToInt32(Console.ReadLine());
  13.             int b = Convert.ToInt32(Console.ReadLine());
  14.             int c = Convert.ToInt32(Console.ReadLine());
  15.             DateTime datetime1 = new DateTime(a,b,c);   //实例化一个datetime的对象datetime1;并将abc的值传递给datetime的构造函数
  16.             string date1 = datetime1.ToLongDateString();//将datetim1的值转化为长日期格式,并赋给字符串变量date1;
  17.             Console.WriteLine(date1);
  18.             char[] dateArr = date1.ToCharArray();//分解字符串
  19.             for (int i = 0; i < dateArr.Length; i++)//循环判断并修改datearr[i]的值
  20.             {
  21.                 switch (dateArr[i])
  22.                 {
  23.                     case '0': dateArr[i] = '零'; break;
  24.                     case '1': dateArr[i] = '一'; break;
  25.                     case '2': dateArr[i] = '二'; break;
  26.                     case '3': dateArr[i] = '三'; break;
  27.                     case '4': dateArr[i] = '四'; break;
  28.                     case '5': dateArr[i] = '五'; break;
  29.                     case '6': dateArr[i] = '六'; break;
  30.                     case '7': dateArr[i] = '七'; break;
  31.                     case '8': dateArr[i] = '八'; break;
  32.                     case '9': dateArr[i] = '九'; break;
  33.                     default: break;
  34.                   
  35.                 }
  36.             }
  37.             int monthNum=0;
  38.             int dayNum = 0;
  39.             for (int i = 0; i <= 5;i++ )//先输出年
  40.             {

  41.                 Console.Write(dateArr[i]);
  42.             }
  43.             for (int i = 6; i <= 8; i++)//输出月
  44.             {
  45.                 if (b > 9 && monthNum == 0)
  46.                 {
  47.                     Console.Write("十");
  48.                     monthNum += 1;
  49.                 }

  50.                 Console.Write(dateArr[i]);
  51.             }
  52.             for (int i = 9; i < dateArr.Length; i++)//输出日
  53.             {
  54.                 if (c > 9 && dayNum == 0)
  55.                 {
  56.                     Console.Write("十");
  57.                     dayNum += 1;
  58.                 }
  59.                 Console.Write(dateArr[i]);
  60.             }
  61.                 Console.ReadKey();
  62.         }
  63.     }
  64. }
复制代码

作者: hehe04    时间: 2012-8-26 23:02
资建文 发表于 2012-8-26 22:54
不好意思卡了下   。。就多回了  也不知道为什么只显示一句

明显对用户需求没仔细看!!:D
作者: 王杨武    时间: 2012-8-27 12:27
本帖最后由 王杨武 于 2012-8-27 12:38 编辑

{:soso_e113:}  这个题我做出来了。现在给你贴一下代码:class Program
    {
        // 5、 c#时间格式转换汉字大写 比如: “2011年6月4日” 转换成 “二零一一年六月四日”。2010年11月11日
        static void Main(string[] args)
        {
            Console.WriteLine("请输入日期:");
            string da = Console.ReadLine();
            if (da.Length >= 9 && da.Length <= 11)
            {
                try
                {
                    //定义转换数组
                    string[] c = new string[] { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖", "年", "月", "日", "十", "十一", "十二" };
                    StringBuilder str = new StringBuilder();
                    //截取月份
                    string strSub = da.Substring(5, 2);

                    char strmon = Convert.ToChar(strSub.Substring(1, 1));
                    //判断截取部分是否有月
                    if (strmon != '月')
                    {
                        for (int count = 0; count < da.Length; count++)
                        {
                            string temp = da.Substring(count, 1);
                            if (count == 5)
                            {
                                string temps = da.Substring(5, 2);
                                switch (temps)
                                {
                                    case "10": str.Append(c[13]); count = 6; continue; break;
                                    case "11": str.Append(c[14]); count = 6; continue; break;
                                    case "12": str.Append(c[15]); count = 6; continue; break;
                                    default:
                                        break;
                                }
                            }
                            switch (temp)
                            {
                                case "0": str.Append(c[0]); break;
                                case "1": str.Append(c[1]); break;
                                case "2": str.Append(c[2]); break;
                                case "3": str.Append(c[3]); break;
                                case "4": str.Append(c[4]); break;
                                case "5": str.Append(c[5]); break;
                                case "6": str.Append(c[6]); break;
                                case "7": str.Append(c[7]); break;
                                case "8": str.Append(c[8]); break;
                                case "9": str.Append(c[9]); break;
                                case "年": str.Append(c[10]); break;
                                case "月": str.Append(c[11]); break;
                                case "日": str.Append(c[12]); break;
                                case "10": str.Append(c[13]); break;
                                default: break;
                            }
                        }
                    }
else
                    {
                        for (int count = 0; count < da.Length; count++)
                        {
                            string temp = da.Substring(count, 1);
                            switch (temp)
                            {
                                case "0": str.Append(c[0]); break;
                                case "1": str.Append(c[1]); break;
                                case "2": str.Append(c[2]); break;
                                case "3": str.Append(c[3]); break;
                                case "4": str.Append(c[4]); break;
                                case "5": str.Append(c[5]); break;
                                case "6": str.Append(c[6]); break;
                                case "7": str.Append(c[7]); break;
                                case "8": str.Append(c[8]); break;
                                case "9": str.Append(c[9]); break;
                                case "年": str.Append(c[10]); break;
                                case "月": str.Append(c[11]); break;
                                case "日": str.Append(c[12]); break;
                                default: break;
                            }
                        }
                    }
                    Console.WriteLine(str.ToString());
                }
                catch
                {

                    throw;
                }
               
            }
            else
            {
                Console.WriteLine("输入错误!");
            }
         
            Console.ReadKey();
        }
    }
作者: 李 玉林    时间: 2012-8-27 22:33
多谢大家的努力
作者: 杨正    时间: 2012-9-3 00:56
本帖最后由 杨正 于 2012-9-3 00:59 编辑

这个题我琢磨了许久,楼上两位的我也都做了测试,都存在明显的bug。
这里需要注意的几点是将“10”转换成“十”,将“20”转换成“二十”,将“29”转换成“二十九”,不是单纯的字符间的转换。
我这里把自己的附上,有不妥的地方,恳请指正,当然,也期待更好的方法。(这里用了枚举,我觉得代码少一点,用switch也是一样的。)

    enum ChineseNum { 〇, 一, 二, 三, 四, 五, 六, 七, 八, 九 };   // 定义枚举:十个数字的汉字
    class Program
    {
        static void Main(string[] args)
        {
            //时间格式转换汉字大写 比如: “2011年6月4日” 转换成 “二零一 一年六月四日”。
            //(参考提示:把字符串作为char数组来用,判断如果是2→’二’,0→’零’,1→‘一’…)
            //但存在一个双位数的月份和双位数的日期的问题,像这种2011年10月20日转换成“二零一二年十月二十日”.
            Console.WriteLine("请您输入一个年份(例:2011年6月4日)");
            string strDate = Console.ReadLine();
            try
            {   //把日期分割成年、月、日三部分
                string[] strsDate = strDate.Split(new char[] { '年', '月', '日' });
                string year = YearToUpper(strsDate[0]);
                string month = MonthToUpper(strsDate[1]);
                string day = DayToUpper(strsDate[2]);
                Console.WriteLine("转换后的日期为:{0}年{1}月{2}日", year, month, day);
            }
            catch
            {
                Console.WriteLine("您输入的日期有误,请重新输入");
            }
            Console.ReadKey();
        }
        /// <summary>
        /// 把年份转换成汉字
        /// </summary>
        /// <param name="stryear"></param>
        /// <returns></returns>
        public static string YearToUpper(string strYear)
        {
            char[] chsYear = strYear.ToCharArray();
            string strYears = "";   //定义年份变量
            for (int i = 0; i < chsYear.Length; i++)
            {   //把年份里的每一个数字分离出来进行判断
                int num = int.Parse(chsYear.ToString());
                strYears += Enum.GetName(typeof(ChineseNum), num);   //将数字年份转换成汉字
            }
            return strYears;
        }
        /// <summary>
        /// 把月份转换成汉字
        /// </summary>
        /// <param name="strMonth"></param>
        /// <returns></returns>
        public static string MonthToUpper(string strMonth)
        {
            string strMonths = "";   //定义月份变量
            int num = int.Parse(strMonth);   //把月份转换成整数形式
            if (num < 10)
            {
                strMonths = YearToUpper(strMonth);
            }
            else if (num == 10)
            {
                strMonths = "十";
            }
            else
            {
                string strM = YearToUpper(strMonth[1].ToString());
                strMonths = "十" + strM;
            }
            return strMonths;
        }
        /// <summary>
        /// 把日期转换成汉字
        /// </summary>
        /// <param name="strDay"></param>
        /// <returns></returns>
        public static string DayToUpper(string strDay)
        {
            string strDays = "";   //定义日期变量
            int num = int.Parse(strDay);   //把日期转换成整数形式
            if (num < 20)
            {
                strDays = MonthToUpper(strDay);
            }
            else if (num == 20 || num == 30)
            {
                string strD = YearToUpper(strDay[0].ToString());
                strDays = strD + "十";
            }
            else
            {
                string strD1 = YearToUpper(strDay[0].ToString());
                string strD2 = YearToUpper(strDay[1].ToString());
                strDays = strD1 + "十" + strD2;
            }
            return strDays;
        }
    }





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