解释器

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 "万"; }
    }
}

posted @ 2008-11-06 17:52  游侠_1  阅读(257)  评论(0编辑  收藏  举报