输入的是数字金额,输出的是金额的英文,请问如何实现?
金额范围是0.00到9999.99
如:$109.65
   U.S.DOLLARS ONE HUNDGRED NINE AND CENTS SIXTY FIVE

解决方案 »

  1.   

    帮你找了个你看看private 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;
      }
      

  2.   

    使用方法:
    NumberToEnglish num = new NumberToEnglish();
    MessageBox.Show(num.changeCurrencyToWords(123));using System;namespace custom.util{public class NumberToEnglish{public String changeNumericToWords(double numb){String num = numb.ToString();return changeToWords(num, false);}public String changeCurrencyToWords(String numb){return changeToWords(numb, true);}public String changeNumericToWords(String numb){return changeToWords(numb, false);}public String changeCurrencyToWords(double numb){return changeToWords(numb.ToString(), true);}private String changeToWords(String numb, bool isCurrency){String val = "", wholeNo = numb, points = "", andStr = "", pointStr="";String endStr = (isCurrency) ? ("Only") : ("");try{int decimalPlace = numb.IndexOf(".");if (decimalPlace > 0){wholeNo = numb.Substring(0, decimalPlace);points = numb.Substring(decimalPlace+1);if (Convert.ToInt32(points) > 0){andStr = (isCurrency)?("and"):("point");// just to separate whole numbers from points/centsendStr = (isCurrency) ? ("Cents "+endStr) : ("");pointStr = translateCents(points);}}val = String.Format("{0} {1}{2} {3}",translateWholeNumber(wholeNo).Trim(),andStr,pointStr,endStr);}catch { ;}return val;}private String translateWholeNumber(String number){string word = "";try{bool beginsZero = false;//tests for 0XXbool isDone = false;//test if already translateddouble dblAmt = (Convert.ToDouble(number));//if ((dblAmt > 0) && number.StartsWith("0"))if (dblAmt > 0){//test for zero or digit zero in a nuemricbeginsZero = number.StartsWith("0");int numDigits = number.Length;int pos = 0;//store digit groupingString place = "";//digit grouping name:hundres,thousand,etc...switch (numDigits){case 1://ones' rangeword = ones(number);isDone = true;break;case 2://tens' rangeword = tens(number);isDone = true;break;case 3://hundreds' rangepos = (numDigits % 3) + 1;place = " Hundred ";break;case 4://thousands' rangecase 5:case 6:pos = (numDigits % 4) + 1;place = " Thousand ";break;case 7://millions' rangecase 8:case 9:pos = (numDigits % 7) + 1;place = " Million ";break;case 10://Billions's rangepos = (numDigits % 10) + 1;place = " Billion ";break;//add extra case options for anything above Billion...default:isDone = true;break;}if (!isDone){//if transalation is not done, continue...(Recursion comes in now!!)word = translateWholeNumber(number.Substring(0, pos)) + place + translateWholeNumber(number.Substring(pos));//check for trailing zerosif (beginsZero) word = " and " + word.Trim();}//ignore digit grouping namesif (word.Trim().Equals(place.Trim())) word = "";}}catch { ;}return word.Trim();}private String tens(String digit){int digt = Convert.ToInt32(digit);String name = null;switch (digt){case 10:name = "Ten";break;case 11:name = "Eleven";break;case 12:name = "Twelve";break;case 13:name = "Thirteen";break;case 14:name = "Fourteen";break;case 15:name = "Fifteen";break;case 16:name = "Sixteen";break;case 17:name = "Seventeen";break;case 18:name = "Eighteen";break;case 19:name = "Nineteen";break;case 20:name = "Twenty";break;case 30:name = "Thirty";break;case 40:name = "Fourty";break;case 50:name = "Fifty";break;case 60:name = "Sixty";break;case 70:name = "Seventy";break;case 80:name = "Eighty";break;case 90:name = "Ninety";break;default:if (digt > 0){name = tens(digit.Substring(0, 1) + "0") + " " + ones(digit.Substring(1));}break;}return name;}private String ones(String digit){int digt = Convert.ToInt32(digit);String name = "";switch (digt){case 1:name = "One";break;case 2:name = "Two";break;case 3:name = "Three";break;case 4:name = "Four";break;case 5:name = "Five";break;case 6:name = "Six";break;case 7:name = "Seven";break;case 8:name = "Eight";break;case 9:name = "Nine";break;}return name;}private String translateCents(String cents){String cts = "", digit = "", engOne = "";for (int i = 0; i < cents.Length; i++){digit = cents[i].ToString();if (digit.Equals("0")){engOne = "Zero";}else{engOne = ones(digit);}cts += " " + engOne;}return cts;}}}