1using System;
  2using System.Collections.Generic;
  3using System.Text;
  4
  5namespace wpTools
  6{
  7    public class TransformDigitMoneyToChineseMoney
  8    {
  9        /// <summary>
 10        /// 转换数字金额为中文大写金额。(包括小数) 
 11        /// </summary>
 12        /// <param name="str">数字金额字符串</param>
 13        /// <returns>转换成中文大写后的字符串或者出错信息提示字符串</returns>   

 14        public string ConvertToChineseMoney(string str)
 15        {
 16            str=str.Trim(); //清除首尾空格。
 17            if (!this.IsPositveDecimal(str)||(str[0]=='0'&&str[1]!='.'))
 18            {
 19                return "您输入的不是有效的数字金额!";
 20            }

 21            double digMoney=double.Parse(str);
 22            if (digMoney> 999999999999.99)
 23            {
 24                return "数字金额太大,无法换算,请输入一万亿元以下的金额!";
 25            }

 26            //else if (digMoney < 0.01)
 27            //{
 28            //    return "数字金额太小,无法换算,请输入一分钱(0.01)以上的金额!";
 29            //}
 30            //char[] ch = new char[1];
 31            //ch[0] = '.'; //小数点 
 32            string[] splitstr = null//定义按小数点分割后的字符串数组 
 33            splitstr = str.Split('.');//按小数点分割字符串 
 34            if (splitstr.Length == 2)
 35            {
 36                string dotLeftStr=splitstr[0].Trim();
 37                string dotRightStr = splitstr[1].Trim();
 38                int i= 0;
 39                for (; i < dotRightStr.Length; ++i)
 40                {
 41                    if (dotRightStr[i] != '0')
 42                    {
 43                        break;
 44                    }

 45                }

 46                if (i > 1 || (i == dotRightStr.Length && 1 == dotRightStr.Length)) //小数部分前两个有效位全部为0,忽略。
 47                {
 48                    return ConvertData(dotLeftStr) + "圆整";
 49                }

 50                else //有小数部分
 51                {
 52                    string rstr;
 53                    if (dotLeftStr[0== '0' && dotLeftStr.Length == 1)
 54                    {
 55                        rstr = ConvertXiaoShu(dotRightStr);//只转换小数部分 
 56                    }

 57                    else
 58                    {
 59                        rstr = ConvertData(dotLeftStr) + "";//转换整数部分 
 60                        rstr += ConvertXiaoShu(dotRightStr);//转换小数部分 
 61                    }

 62                    return rstr;
 63                }

 64            }

 65            else //只有整数部分 
 66            {
 67                return ConvertData(str) + "圆整";
 68            }

 69        }
         
 70        /// <summary>
 71        /// 判断是否是正数字字符串
 72        /// </summary>
 73        /// <param name="str">待判断字符串</param>
 74        /// <returns>如果是数字,返回true,否则返回false </returns>

 75        private bool IsPositveDecimal(string str)
 76        {
 77            double d;
 78            try
 79            {
 80                d = double.Parse(str);
 81            }

 82            catch
 83            {
 84                return false;
 85            }

 86            if (d >= 0.01)
 87            {
 88                return true;
 89            }

 90            else
 91            {
 92                return false;
 93            }

 94        }

 95        /// <summary>
 96        /// 转换数字(整数)
 97        /// </summary>
 98        /// <param name="str">需要转换的整数数字字符串 </param>
 99        /// <returns>转换成中文大写后的字符串</returns>

100        private string ConvertData(string str)
101        {
102            string tmpstr = "";
103            string rstr = "";
104            int strlen = str.Length;
105            if (strlen <= 4)//数字长度小于四位 
106            {
107                rstr = ConvertDigit(str);
108            }

109            else
110            {
111                if (strlen <= 8)//数字长度大于四位,小于八位 
112                {
113                    tmpstr = str.Substring(strlen - 44);//先截取最后四位数字 
114                    rstr = ConvertDigit(tmpstr);//转换最后四位数字 
115                    tmpstr = str.Substring(0, strlen - 4);//截取其余数字 
116                    //将两次转换的数字加上萬后相连接 
117                    rstr = String.Concat(ConvertDigit(tmpstr) + "", rstr);
118                    rstr = rstr.Replace("零萬""");
119                    rstr = rstr.Replace("零零""");
120
121                }

122                else if (strlen <= 12)//数字长度大于八位,小于十二位 
123                {
124                    tmpstr = str.Substring(strlen - 44);//先截取最后四位数字 
125                    rstr = ConvertDigit(tmpstr);//转换最后四位数字 
126                    tmpstr = str.Substring(strlen - 84);//再截取四位数字 
127                    rstr = String.Concat(ConvertDigit(tmpstr) + "", rstr);
128                    tmpstr = str.Substring(0, strlen - 8);
129                    rstr = String.Concat(ConvertDigit(tmpstr) + "", rstr);
130                    rstr = rstr.Replace("零億""");
131                    rstr = rstr.Replace("零萬""");
132                    rstr = rstr.Replace("零零""");
133                    rstr = rstr.Replace("零零""");
134                }

135            }

136            strlen = rstr.Length;
137            if (strlen >= 2)
138            {
139                switch (rstr.Substring(strlen - 22))
140                {
141                    case "佰零": rstr = rstr.Substring(0, strlen - 2+ ""break;
142                    case "仟零": rstr = rstr.Substring(0, strlen - 2+ ""break;
143                    case "萬零": rstr = rstr.Substring(0, strlen - 2+ ""break;
144                    case "億零": rstr = rstr.Substring(0, strlen - 2+ ""break;
145
146                }

147            }

148            return rstr;
149        }

150        /// <summary>
151        /// 转换数字(小数部分)
152        /// </summary>
153        /// <param name="str">需要转换的小数部分数字字符串</param>
154        /// <returns>转换成中文大写后的字符串</returns>

155        private string ConvertXiaoShu(string str)
156        {
157            int strlen = str.Length;
158            string rstr;
159            if (strlen == 1)
160            {
161                rstr = ConvertChinese(str) + "";
162                return rstr;
163            }

164            else
165            {
166                string tmpstr = str.Substring(01);
167                rstr = ConvertChinese(tmpstr) + "";
168                tmpstr = str.Substring(11);
169                rstr += ConvertChinese(tmpstr) + "";
170                rstr = rstr.Replace("零分""");
171                rstr = rstr.Replace("零角""");
172                return rstr;
173            }

174        }

175        /// <summary>
176        /// 转换数字
177        /// </summary>
178        /// <param name="str">转换的字符串(四位以内)</param>
179        /// <returns></returns> 

180        private string ConvertDigit(string str)
181        {
182            int strlen = str.Length;
183            string rstr = "";
184            switch (strlen)
185            {
186                case 1: rstr = ConvertChinese(str); break;
187                case 2: rstr = Convert2Digit(str); break;
188                case 3: rstr = Convert3Digit(str); break;
189                case 4: rstr = Convert4Digit(str); break;
190            }

191            rstr = rstr.Replace("拾零""");
192            strlen = rstr.Length;
193
194            return rstr;
195        }

196        /// <summary>
197        /// 转换四位数字
198        /// </summary>
199        /// <param name="str"></param>
200        /// <returns></returns>

201        private string Convert4Digit(string str)
202        {
203            string str1 = str.Substring(01);
204            string str2 = str.Substring(11);
205            string str3 = str.Substring(21);
206            string str4 = str.Substring(31);
207            string rstring = "";
208            rstring += ConvertChinese(str1) + "";
209            rstring += ConvertChinese(str2) + "";
210            rstring += ConvertChinese(str3) + "";
211            rstring += ConvertChinese(str4);
212            rstring = rstring.Replace("零仟""");
213            rstring = rstring.Replace("零佰""");
214            rstring = rstring.Replace("零拾""");
215            rstring = rstring.Replace("零零""");
216            rstring = rstring.Replace("零零""");
217            rstring = rstring.Replace("零零""");
218            return rstring;
219        }

220        /// <summary>
221        /// 转换三位数字
222        /// </summary>
223        /// <param name="str"></param>
224        /// <returns></returns>

225        private string Convert3Digit(string str)
226        {
227            string str1 = str.Substring(01);
228            string str2 = str.Substring(11);
229            string str3 = str.Substring(21);
230            string rstring = "";
231            rstring += ConvertChinese(str1) + "";
232            rstring += ConvertChinese(str2) + "";
233            rstring += ConvertChinese(str3);
234            rstring = rstring.Replace("零佰""");
235            rstring = rstring.Replace("零拾""");
236            rstring = rstring.Replace("零零""");
237            rstring = rstring.Replace("零零""");
238            return rstring;
239        }

240        /// <summary>
241        /// 转换二位数字 
242        /// </summary>
243        /// <param name="str"></param>
244        /// <returns></returns>

245        private string Convert2Digit(string str)
246        {
247            string str1 = str.Substring(01);
248            string str2 = str.Substring(11);
249            string rstring = "";
250            rstring += ConvertChinese(str1) + "";
251            rstring += ConvertChinese(str2);
252            rstring = rstring.Replace("零拾""");
253            rstring = rstring.Replace("零零""");
254            return rstring;
255        }

256        /// <summary>
257        /// 将一位数字转换成中文大写数字 
258        /// </summary>
259        /// <param name="str"></param>
260        /// <returns></returns>         

261        private string ConvertChinese(string str)
262        {
263            //"零壹贰叁肆伍陆柒捌玖拾佰仟萬億圆整角分" 
264            string cstr = "";
265            switch (str)
266            {
267                case "0": cstr = ""break;
268                case "1": cstr = ""break;
269                case "2": cstr = ""break;
270                case "3": cstr = ""break;
271                case "4": cstr = ""break;
272                case "5": cstr = ""break;
273                case "6": cstr = ""break;
274                case "7": cstr = ""break;
275                case "8": cstr = ""break;
276                case "9": cstr = ""break;
277            }

278            return (cstr);
279        }

280    }

281}
posted on 2008-02-25 15:38  windpole  阅读(624)  评论(0)    收藏  举报