黑马程序员技术交流社区
标题:
转换日期里的数字为汉字
[打印本页]
作者:
李君言
时间:
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日转换为汉子版的"二零一一年二月十六日"我是这样写的
//编写一个函数进行日期转换,将输入的中文日期转换为阿拉伯数字日期,
//比如:二零一二年十二月月二十一日要转换为2012-12-21
/**** 以下为日期转换函数 ******/
static string StringChange(string str)
{
char[] sstr = str.ToCharArray();
string newstr = "";
for (int i = 0; i < sstr.Length; i++)
{
switch (sstr[i])
{
case '零':
sstr[i] = '0';
break;
case '一':
sstr[i] = '1';
break;
case '二':
sstr[i] = '2';
break;
case '三':
sstr[i] = '3';
break;
case '四':
sstr[i] = '4';
break;
case '五':
sstr[i] = '5';
break;
case '六':
sstr[i] = '6';
break;
case '七':
sstr[i] = '7';
break;
case '八':
sstr[i] = '8';
break;
case '九':
sstr[i] = '9';
break;
case '十':
break;
case '月':
sstr[i] = '-';
break;
case '年':
sstr[i] = '-';
break;
case '日':
break;
}
}
for (int i = 0; i < sstr.Length; i++)
{
if (sstr[i] != '十' && sstr[i] != '日')
{
if (sstr[i] == '-')//避免'--'
{
if(sstr[i+1]=='-')
{
continue;
}
}
sstr[i].ToString();
newstr = newstr + sstr[i].ToString();
}
}
return newstr;
}
static void Main(string[] args)
{
string str = "二零一二年十二月月二十一日";
string newstr = StringChange(str);
Console.WriteLine(newstr);
Console.ReadKey();
}
复制代码
作者:
何图
时间:
2013-4-24 18:13
遇到日和十就跳过没有处理
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2