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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 董振海 中级黑马   /  2012-10-10 10:22  /  3907 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

比如: “2011年6月4日” 转换成 “二零一一年六月四日”。 没有好的算法能解决, 请高手解答

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

9 个回复

倒序浏览
  1. static void Main(string[] args)
  2.         {
  3.             string str = "2011年6月4日";//定义字符串变量str接受日期
  4.             char[] newchar=str.ToCharArray();//把字符串变量str转换成char类型的数组并赋给newchar
  5.             for (int i = 0; i < newchar.Length;i++ )//遍历newchar
  6.             {
  7.                 switch(newchar[i])//判断第i个字符数组是什么
  8.                 {
  9.                     case '0'://如果是0,则把0替换为零,下面依次替换
  10.                         newchar[i] = '零';
  11.                         break;
  12.                     case '1':
  13.                         newchar[i]='一';
  14.                         break;
  15.                     case '2':
  16.                         newchar[i] = '二';
  17.                         break;
  18.                     case '3':
  19.                         newchar[i] = '三';
  20.                         break;
  21.                     case '4':
  22.                         newchar[i] = '四';
  23.                         break;
  24.                     case '5':
  25.                         newchar[i] = '五';
  26.                         break;
  27.                     case '6':
  28.                         newchar[i] = '六';
  29.                         break;
  30.                     case '7':
  31.                         newchar[i] = '七';
  32.                         break;
  33.                     case '8':
  34.                         newchar[i] = '八';
  35.                         break;
  36.                     case '9':
  37.                         newchar[i] = '九';
  38.                         break;
  39.                 }
  40.             }
  41.             Console.WriteLine(newchar);//输出newchar
  42.             Console.ReadKey();
  43.         }
复制代码
至于10到31,一点一点写case语句... 笨方法,只能想到这个..

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
许波 发表于 2012-10-10 12:36
至于10到31,一点一点写case语句... 笨方法,只能想到这个..

这个方法我也想到了,就是感觉太.....想找一个好一点的算法
回复 使用道具 举报
先上效果图

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报

  1. namespace 日期转大写
  2. {
  3.     public partial class Form1 : Form
  4.     {
  5.         public Form1()
  6.         {
  7.             InitializeComponent();
  8.         }

  9.         private void btn_Convert_Click(object sender, EventArgs e)
  10.         {
  11.             string OritDate = txt_OritDate.Text;
  12.             //对日期进行分割,获得相应日期数字
  13.             char[] Split = { '年', '月', '日' };
  14.             string[] OritArr = OritDate.Split(Split);

  15.             //通过转换方法对年月日进行转换,并获得新的年月日
  16.             string newYear=YearConvert(OritArr[0]);
  17.             string newMonth = MDConvert(OritArr[1]);
  18.             string newDay = MDConvert(OritArr[2]);

  19.             //拼接新的日期并显示
  20.             string newDate = newYear + "年" + newMonth + "月" + newDay + "日";
  21.             txt_NewDate.Text = newDate;
  22.         }


  23.         private string YearConvert(string s)
  24.         {
  25.             //对年份进行转换
  26.             char[] yearW = s.ToCharArray();
  27.             char[] numUP = { '零', '一', '二', '三', '四', '五', '六', '七', '八', '九' };
  28.             string newYear = "";
  29.             for (int i = 0; i < yearW.Length; i++)
  30.             {
  31.                 //根据字符数组yearW中的数字获取字符数组numUP中相对的大小数字
  32.                 newYear = newYear + numUP[Convert.ToInt32(yearW[i].ToString())].ToString();
  33.             }
  34.             return newYear;
  35.    
  36.         }
  37.         private string MDConvert(string md)
  38.         {
  39.             //思路跟年份差不多,只是考虑了位数和整十的情况
  40.             //定义一个字符数组存放大小数字,只是零用空来代替,因为出现零的时候不需要显示
  41.             char[] numUP = { ' ', '一', '二', '三', '四', '五', '六', '七', '八', '九' };
  42.             if (md.Length == 1)
  43.             {
  44.                 //根据字符数组yearW中的数字获取字符数组numUP中相对的大小数字,因为可能在出现整十的时候会有空格,所以最后要去掉空格
  45.                 string newMD = numUP[Convert.ToInt32(md.ToString())].ToString().Trim();
  46.                 return newMD;
  47.             }
  48.             else
  49.             {
  50.                 string newMD = "";
  51.                 switch (md[0])
  52.                 {
  53.                     case '1':
  54.                         newMD = "十" + numUP[Convert.ToInt32(md[1].ToString())].ToString().Trim();
  55.                         break;
  56.                     case '2':
  57.                         newMD = "二十" + numUP[Convert.ToInt32(md[1].ToString())].ToString().Trim();
  58.                         break;
  59.                     default:
  60.                         newMD = "三十" + numUP[Convert.ToInt32(md[1].ToString())].ToString().Trim();
  61.                         break;
  62.                 }

  63.                 return newMD;
  64.             }
  65.         }
  66.     }
  67. }
复制代码
当然,这还是有些BUG的,比如输入的日期不规范,那你可以自己进行约束下,我这里只是想说怎么实现这个转换。思路来源于教学视频中身份证号验证
回复 使用道具 举报
李后量 发表于 2012-10-11 12:01
当然,这还是有些BUG的,比如输入的日期不规范,那你可以自己进行约束下,我这里只是想说怎么实现这个转换 ...

十分感谢~~~
回复 使用道具 举报
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Text.RegularExpressions;

  6. namespace Test6
  7. {
  8.     class Program
  9.     {
  10.         // c#时间格式转换汉字大写 比如:
  11.         //“2011年6月4日” 转换成 “二零一一年六月四日”。

  12.         static void Main(string[] args)
  13.         {
  14.             string Time,TimeN=string.Empty;
  15.           end :  Console.WriteLine("输入一串字符表示时间转换汉字大写"+
  16.                 "如 2011年6月4日——二零一一年六月四日 :");
  17.             Time = Console.ReadLine();
  18.             //判断输入格式       //表达式简单写了下
  19.             if (!Regex.IsMatch(Time, "^[0-9]{4}年([1-9]|10|11|12)月([1-9]|[1-2][0-9]|3[0-1])日$"))
  20.             { Console.WriteLine("日期格式不对"); goto end; ;}


  21.             //循环中转数字
  22.             foreach (char c in Time)
  23.             {
  24.                 switch (c)
  25.                 {
  26.                     case '1': TimeN += "壹"; break;
  27.                     case '2': TimeN += "贰"; break;
  28.                     case '3': TimeN += "叁"; break;
  29.                     case '4': TimeN += "肆"; break;
  30.                     case '5': TimeN += "伍"; break;
  31.                     case '6': TimeN += "陆"; break;

  32.                     case '7': TimeN += "柒"; break;
  33.                     case '8': TimeN += "捌"; break;
  34.                     case '9': TimeN += "玖"; break;
  35.                     case '0': TimeN += "零"; break;
  36.                     default: TimeN += c; break;

  37.                 }
  38.             }

  39.                 Console.WriteLine("转换后:"+TimeN);
  40.                 Console.Read();

  41.             
  42.         }
  43.     }
  44. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
string timeStr = "2011年6月4日";
            char[] timeCh = timeStr.ToCharArray();//转换为字符数组

            //遍历字符数组,将阿拉伯数字转换为汉字大写
            for (int i = 0; i < timeCh.Length; i++)
            {
                switch (timeCh[i])
                {
                    case '0': timeCh[i] = '零'; break;
                    case '1': timeCh[i] = '一'; break;
                    case '2': timeCh[i] = '二'; break;
                    case '3': timeCh[i] = '三'; break;
                    case '4': timeCh[i] = '四'; break;
                    case '5': timeCh[i] = '五'; break;
                    case '6': timeCh[i] = '六'; break;
                    case '7': timeCh[i] = '七'; break;
                    case '8': timeCh[i] = '八'; break;
                    case '9': timeCh[i] = '九'; break;
                }
            }
            Console.WriteLine(timeCh);//输出转换后的格式
            Console.ReadKey();

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
这是基础测试的一个题,我做过了的,开始也只能想到case做,那样太麻烦了,请教同学后做出的结果:
string[] myArr = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
            while (true)
            {
                Console.Write("输入XXXX年XX月XX日:");
                string inputTime = Console.ReadLine();
                try
                {
                    //截取字符串  年
                    string year = inputTime.Substring(0, inputTime.IndexOf('年'));
                    //截取字符串  月
                    string month = inputTime.Substring(inputTime.IndexOf('年') + 1, inputTime.IndexOf('月') - (inputTime.IndexOf('年') + 1));
                    //截取字符串  日
                    string day = inputTime.Substring(inputTime.IndexOf('月') + 1, inputTime.IndexOf('日') - (inputTime.IndexOf('月') + 1));
                    //定义字符串叠加字符
                    StringBuilder str = new StringBuilder();
                    //定义索引,通过该索引在数组中去值
                    int index;
                    //年,循环年字符串,分别组合成汉字叠加到字符串中
                    for (int i = 0; i < year.Length; i++)
                    {
                        //将年中的每一个字节转成整型作为数组的下标
                        index = int.Parse(year[i].ToString());
                        //叠加字符串,通过index的下标在myArr数组中获取汉字
                        str.Append(myArr[index]);
                    }
                    str.Append("年");
                    //月,如果输入的月份大于10或者等于10
                    if (int.Parse(month) >= 10)
                    {
                        //当进入到if中就是大于10的,必然会有十读法
                        str.Append("十");
                        //当month不等于10,也就是说当为11 12 月的时候
                        if (month != "10")
                        {
                            //将月字符串中,下标为1的字节取出,作为数组的索引
                            index = Convert.ToInt32(month[1].ToString());
                            //叠加字符串,通过索引获取数组中的汉字
                            str.Append(myArr[index]);
                        }
                        str.Append("月");
                    }
                    else
                    {
                        //当月份不大于10的时候,直接通过GetNum方法获取索引
                        //并通过方法返回的索引在数组中取出汉字
                        str.Append(myArr[GetNum(month)] + "月");
                    }
                    //日 如果输入的日期大于10或者等于10
                    if (int.Parse(day) >= 10)//判断月是否大于10
                    {
                        //如果等于10 则转换成十  而不是一零
                        if (day == "10")
                        {
                            str.Append("十");
                        }
                        else//出掉大于等于10中的特殊日期
                        {
                            //循环日期
                            for (int i = 0; i < day.Length; i++)
                            {
                                //当日期中的十位数为0,的时候跳出循环,20 30
                                //只有i=1的时候才会执行
                                if (day[i] == '0')
                                {
                                    break;
                                }
                                //当日期在11-19日期间,并且i=1
                                if (i == 0 && day[0] == '1')
                                {
                                    str.Append("十");
                                    //结束本次循环,进入下次循环
                                    continue;
                                }
                                //获取日期中的值,得到数组中需要的索引
                                index = int.Parse(day[i].ToString());
                                //通过索引获取数组中的值并叠加字符串
                                str.Append(myArr[index]);
                                //当I=0时,数字在21-29 31等日期时中间叠加一个"十"
                                //二十三日
                                if (i == 0)
                                {
                                    str.Append("十");
                                }
                            }
                        }
                        str.Append("日");
                    }
                    else
                    {
                        //当日期小于10,通过GetNnum方法得到数组索引
                        str.Append(myArr[GetNum(day)] + "日");
                    }
                    Console.WriteLine(str.ToString());
                }
                catch (Exception)
                {
                    Console.WriteLine("您输入有误!!");
                }
            }
        }
        static int GetNum(string str)
        {
            //截取字符串,查找最后一次出现0的位置加1处开始截取1的长度,并返回
            return int.Parse(str.Substring(str.LastIndexOf('0') + 1, 1));
        }

这个应该没bug的..

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
果然还是要switch啊= =
我一直觉得.net应该有了类提供这个功能
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马