解释器
using System;
using System.Web;
using System.Collections.Generic;
public partial class DesignPattern_解释器 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
List<JieShiQi> JiShi = new List<JieShiQi>();
JiShi.Add(new JieShiQiShi());
JiShi.Add(new JieShiQiBai());
JiShi.Add(new JieShiQiQian());
JiShi.Add(new JieShiQiGe());
JiShi.Add(new JieShiQiWan());
ChangeInfo info = new ChangeInfo("三千四百二十八万五千七百三十二");
info.Data = 0;
foreach (JieShiQi jie in JiShi)
{
info.Data+= jie.JieShi(info.Text);
}
Response.Write(info.Text + "的数字为" + info.Data);
}
}
public class NumAndChar
{
public NumAndChar(int number, string Char)
{
Number = number;
_Char = Char;
}
private int _Number;
//数字
public int Number
{
get { return _Number; }
set { _Number = value; }
}
private string _Char;
//数字对应的汉字
public string Char
{
get { return _Char; }
set { _Char = value; }
}
}
public class ChangeInfo
{
public ChangeInfo(string text)
{
Text = text;
}
private string _Text;
//原始文本
public string Text
{
get { return _Text; }
set { _Text = value; }
}
private int _Data;
//转换后的数字
public int Data
{
get { return _Data; }
set { _Data = value; }
}
}
public abstract class JieShiQi
{
public List<NumAndChar> ListChange = new List<NumAndChar>();
public int Data;
public JieShiQi()
{
ListChange.Add(new NumAndChar(0, "零"));
ListChange.Add(new NumAndChar(1, "一"));
ListChange.Add(new NumAndChar(2, "二"));
ListChange.Add(new NumAndChar(3, "三"));
ListChange.Add(new NumAndChar(4, "四"));
ListChange.Add(new NumAndChar(5, "五"));
ListChange.Add(new NumAndChar(6, "六"));
ListChange.Add(new NumAndChar(7, "七"));
ListChange.Add(new NumAndChar(8, "八"));
ListChange.Add(new NumAndChar(9, "九"));
}
public virtual int JieShi(string info)
{
foreach (NumAndChar change in ListChange)
{
if (info.IndexOf(change.Char + this.Char) > -1)
{
Data += change.Number * Cen;
}
}
//HttpContext.Current.Response.Write("<br>"+this.Char+Data.ToString());
return Data;
}
public abstract int Cen
{
get;
}
public abstract string Char
{
get;
}
}
public class JieShiQiGe : JieShiQi
{
public override int JieShi(string info)
{
foreach (NumAndChar change in ListChange)
{
if (info.EndsWith(change.Char))
{
Data += change.Number;
}
}
// HttpContext.Current.Response.Write("<br>" + this.Char + Data.ToString());
return Data;
}
public override int Cen
{
get { return 1; }
}
public override string Char
{
get { return "个"; }
}
}
public class JieShiQiShi : JieShiQi
{
public override int Cen
{
get { return 10; }
}
public override string Char
{
get { return "十"; }
}
}
public class JieShiQiBai : JieShiQi
{
public override int Cen
{
get { return 100; }
}
public override string Char
{
get { return "百"; }
}
}
public class JieShiQiQian : JieShiQi
{
public override int Cen
{
get { return 1000; }
}
public override string Char
{
get { return "千"; }
}
}
public class JieShiQiWan : JieShiQi
{
public override int JieShi(string info)
{
if (info.IndexOf(this.Char) > -1)
{
List<JieShiQi> JiShiWan = new List<JieShiQi>();
JiShiWan.Add(new JieShiQiShi());
JiShiWan.Add(new JieShiQiBai());
JiShiWan.Add(new JieShiQiQian());
JiShiWan.Add(new JieShiQiGe());
foreach (JieShiQi jie in JiShiWan)
{
int wan =jie.JieShi(info.Substring(0, info.IndexOf(this.Char))); //这里实现了解释器可以以任意顺序排列进来,,不管万在前还是在后
Data+= wan*10000;
Data -= (wan/10)*10;//同理 原理就是先求出万位是多少万,最后再减去万位的十百千对数字造成的误差,个位不用考虑了,,因为个位的判断是最后一位,不对因为有万位而造成误差
}
}
// HttpContext.Current.Response.Write("<br>" + this.Char + Data.ToString());
return Data;
}
public override int Cen
{
get { return 10000; }
}
public override string Char
{
get { return "万"; }
}
}