案例:编写一个函数进行日期转换,将输入的中文日期转换为阿拉伯数字日期
比如:二零一二年十二月月二十一日要转换为2012-12-21。(处理“十”
的问题:1.*月十日;2.*月十三日;3.*月二十三日;4.*月三十日;)
四中情况对“十”的不同翻译。1→10;2→1;3→不翻译;4→0【年部分不
可能出现’十’,都出现在了月与日部分。】
测试数据:二零一二年十二月二十一日(2012年12月21日)、二零零九年七
月九日、二零一零年十月二十四日、二零一零年十月二十日
分析:可以考虑用字典,给出键,输出对应值
难点在对十的处理
情况 处理
一个数 10
两个数 在前 1
两个数 在后 0
三个数 在中间(一定) 不翻译
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 日期格式转换
{
class Program
{
static void Main(string[] args)
{
while (true)
{
Console.WriteLine("请输入日期");
string dates = Console.ReadLine().Trim();
StringBuilder date = new StringBuilder();
date = GetDateFormat(dates);//具体的格式转化封装成了方法
Console.WriteLine(date);
Console.ReadKey();
Console.Clear();
}
}
/// <summary>
/// 方法:字典,再调用格式转换
/// </summary>
/// <param name="date"></param>
/// <returns></returns>
private static StringBuilder GetDateFormat(string date)
{
//声明字典,存入日期相关的键值
Dictionary<char, char> dic = new Dictionary<char, char>();
//给出字符串,放入可能出现的各个键和值,十特殊处理
string txt = "零0 一1 二2 三3 四4 五5 六6 七7 八8 九9";
//分割txt得到各个键值,分别存入字典
string[] keyValue = txt.Split(new char[] { ‘ ‘ }, StringSplitOptions.RemoveEmptyEntries);
//遍历数组,分别存入对应的键值对
for (int i = 0; i < keyValue.Length; i++)
{
if (!dic.ContainsKey(keyValue[i][0]))
{
dic.Add(keyValue[i][0], keyValue[i][1]);
}
}
//调用方法,返回数字格式的日期
return GetDigitDate(dic,date);
}
/// <summary>
/// 方法:格式转换
/// </summary>
/// <param name="dic"></param>
/// <param name="date"></param>
/// <returns></returns>
private static StringBuilder GetDigitDate(Dictionary<char, char> dic, string date)
{
//字符串转为字符数组
char[] chs = date.ToCharArray();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < chs.Length; i++)
{
对十的处理
情况 翻译成:
十 10
十几 1
几十 0
几十几 不翻译
if (chs[i] == ‘十‘)
{
X代表字典中没有包含的字符
//十 X十X 10
if (!dic.ContainsKey(chs[i - 1]) && !dic.ContainsKey(chs[i + 1]))
{
sb.Append("10");
}
//十几 X十几X 1
else if (!dic.ContainsKey(chs[i - 1]) && dic.ContainsKey(chs[i + 1]))
{
sb.Append("1");
}
//几十 X几十X 0
else if (dic.ContainsKey(chs[i - 1]) && !dic.ContainsKey(chs[i + 1]))
{
sb.Append("0");
}
//几十几 X几十几X 空
else if (!dic.ContainsKey(chs[i - 1]) && !dic.ContainsKey(chs[i + 1]))
{
sb.Append("");
}
}
else if (dic.ContainsKey(chs[i]))
{
//字典中存在就输出对应值
sb.Append(dic[chs[i]].ToString());
}
else if (chs[i] == ‘年‘ || chs[i] == ‘月‘)
{
//年、月用—替换
sb.Append("-");
}
}
return sb;
}
}
}
总结:本题的难点在对十的处理,它可以返回10,1,0,“”;四种情况;字典是<char,char>类型的,要对输入字符串的每一个字符进行判断,如果通过chs[i]=‘x‘;然后
return new string(chs);字符串的方法会很棘手(如翻译成10时很难处理);这时要想到到StringBuilder的方法。