不知哪位大侠能够提供一个数字转成英文的算法
 e.g.   202,321.17  转换如下:
TWO HUNDRED AND TWO THOUSAND THREE HUNDRED AND TWENTY ONE AND CENTS SEVENTEEN ONLY  
    

解决方案 »

  1.   

    本帖最后由 viena 于 2008-06-24 15:31:28 编辑
      

  2.   

    using System;
    using System.Collections.Generic;
    using System.Text;namespace ConsoleApplication2
    {
        class Program
        {
            static void Main(string[] args)
            {
              string str=  new convertor().numberToEnglish(decimal.Parse("202321.17"));
            }        class convertor
            {
                public string numberToEnglish(decimal y)
                {
                    string numberStr = "";
                    string lStr = "";//小数点左边字符串
                    string rStr = "";//小数点右边字符串
                    numberStr = (string)y.ToString();
                    int dot;//小数点位置
                    dot = numberStr.IndexOf(".");
                    if (dot != 0 & dot != -1)//判断有没有小数
                    {
                        lStr = numberStr.Substring(0, dot);//取小数点left的字串
                        if (numberStr.Substring(dot + 1, 2) == "00")
                        {
                            rStr = "";
                        }
                        else
                        {
                            rStr = numberStr.Substring(dot + 1, 2);//取小数点right的字串
                        }
                    }
                    else
                    {
                        lStr = numberStr;//没有小数点的情况
                    }
                    string lStrRev;
                    lStrRev = reverseString(lStr);//对左边的字串取反字串
                    string[] a = new string[5];//定义5个字串变量用来存放解析出的三位一组的字串                switch (lStrRev.Length % 3)
                    {
                        case 1:
                            lStrRev = lStrRev + "00"; break;                    case 2:
                            lStrRev = lStrRev + "0"; break;                }
                    string StrInt;//用来存放转换后的整数部分
                    StrInt = "";
                    for (int i = 0; i <= lStrRev.Length / 3 - 1; i++)//计算有多少个三位 
                    {
                        a[i] = reverseString(lStrRev.Substring(3 * i, 3));//截取第1个三位
                        if (a[i] != "000")//用来避免这种情况“1000000=ONE MILLION THOUSAND ONLY”
                        {
                            if (i != 0)
                            {
                                StrInt = w3(a[i]) + " " + dw(i.ToString()) + " " + StrInt;//用来加上“THOUSAND OR MILLION OR BILLION” 
                            }
                            else
                            {
                                StrInt = w3(a[i]);//防止i=0时“lm=w3(a(i))+" "+dw(i)+" "+lm”多加两个尾空格
                            }
                        }
                        else
                        {
                            StrInt = w3(a[i]) + StrInt;
                        }
                    }
                    string StrDce;//用来存放转换后的小数部分
                    StrDce = "";
                    if (dot != 0 & dot != -1 & rStr != "")
                    {
                        rStr = "0" + rStr;
                        StrDce = " AND POINT " + w2(rStr);
                    }
                    return StrInt + StrDce;
                }
                //将字符串反置
                private string reverseString(string str)
                {
                    int lenInt = str.Length;
                    string[] z = new string[str.Length];
                    for (int i = 0; i < lenInt; i++)
                    {
                        z[i] = str.Substring(i, 1);
                    }
                    str = "";
                    for (int i = lenInt - 1; i >= 0; i--)
                    {
                        str = str + z[i];
                    }
                    return str;
                }
                private string zr4(string y)
                {
                    string[] z = new string[10];
                    z[1] = "ONE";
                    z[2] = "TWO";
                    z[3] = "THREE";
                    z[4] = "FOUR";
                    z[5] = "FIVE";
                    z[6] = "SIX";
                    z[7] = "SEVEN";
                    z[8] = "EIGHT";
                    z[9] = "NINE";
                    return z[Int32.Parse(y.Substring(0, 1))];
                }
                private string zr3(string y)
                {
                    string[] z = new string[10];
                    z[1] = "ONE";
                    z[2] = "TWO";
                    z[3] = "THREE";
                    z[4] = "FOUR";
                    z[5] = "FIVE";
                    z[6] = "SIX";
                    z[7] = "SEVEN";
                    z[8] = "EIGHT";
                    z[9] = "NINE";
                    return z[Int32.Parse(y.Substring(2, 1))];
                }
                private string zr2(string y)
                {
                    string[] z = new string[20];
                    z[10] = "TEN";
                    z[11] = "ELEVEN";
                    z[12] = "TWELVE";
                    z[13] = "THIRTEEN";
                    z[14] = "FOURTEEN";
                    z[15] = "FIFTEEN";
                    z[16] = "SIXTEEN";
                    z[17] = "SEVENTEEN";
                    z[18] = "EIGHTEEN";
                    z[19] = "NINETEEN";
                    return z[Int32.Parse(y.Substring(1, 2))];
                }
                private string zr1(string y)
                {
                    string[] z = new string[10];
                    z[1] = "TEN";
                    z[2] = "TWENTY";
                    z[3] = "THIRTY";
                    z[4] = "FORTY";
                    z[5] = "FIFTY";
                    z[6] = "SIXTY";
                    z[7] = "SEVENTY";
                    z[8] = "EIGHTY";
                    z[9] = "NINETY";
                    return z[Int32.Parse(y.Substring(1, 1))];
                }
                private string dw(string y)
                {
                    string[] z = new string[5];
                    z[0] = "";
                    z[1] = "THOUSAND";
                    z[2] = "MILLION";
                    z[3] = "BILLION";
                    return z[Int32.Parse(y)];
                }
                //用来制作2位数字转英文 
                private string w2(string y)
                {
                    string tempstr;
                    if (y.Substring(1, 1) == "0")//判断是否小于十
                        tempstr = zr3(y);
                    else
                        if (y.Substring(1, 1) == "1")//判断是否在十到二十之间
                            tempstr = zr2(y);
                        else
                        {
                            if (y.Substring(2, 1) == "0")//判断是否为大于二十小于一百的能被十整除的数(为了去掉尾空格)
                            {
                                tempstr = zr1(y);
                            }
                            else
                            {
                                tempstr = zr1(y) + " " + zr3(y);
                            }
                        }
                    return tempstr;
                }
                private string w3(string y)
                {
                    string tempstr;
                    if (y.Substring(0, 1) == "0")//判断是否小于一百 
                        tempstr = w2(y);
                    else
                    {
                        if (y.Substring(1, 2) == "00")//判断是否能被一百整除
                        {
                            tempstr = zr4(y) + " " + "HUNDRED";
                        }
                        else
                        {
                            tempstr = zr4(y) + " " + "HUNDRED" + " " + "AND" + " " + w2(y);//不能整除的要后面加“AND” 
                        }
                    }
                    return tempstr;
                }
            }
        }
         
    }
      

  3.   

    jjjjjjjj