C# 大小写转换(非金额)

Class
  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 
  6 namespace WindowsFormsApplication1
  7 {
  8     class numtoUpperString
  9     {
 10         private readonly char[] chnText; 
 11         private readonly char[] chnDigit; 
 12         public numtoUpperString() 
 13           { 
 14            chnText  = new char[]{'', '', '', '', '', '', '', '', '', ''}; 
 15            chnDigit = new char[]{'', '', '', '', '亿'}; 
 16           } 
 17         public string Convert( string strDigit ) 
 18           { 
 19            // 检查输入数字 
 20            decimal dec; 
 21            try 
 22            { 
 23             dec = decimal.Parse( strDigit ); 
 24            } 
 25            catch( FormatException ) 
 26            { 
 27             throw new Exception("输入数字的格式不正确。"); 
 28            } 
 29            catch( Exception e ) 
 30            { 
 31             throw e; 
 32            } 
 33            if( dec <= -10000000000000000m || dec >= 10000000000000000m ) 
 34            { 
 35             throw new Exception( "输入数字太大或太小,超出范围。" ); 
 36            } 
 37            StringBuilder strResult = new StringBuilder(); 
 38            // 提取符号部分 
 39            // '+'在最前 
 40            if( "+" == strDigit.Substring( 0, 1 ) ) 
 41            { 
 42             strDigit = strDigit.Substring( 1 ); 
 43            } 
 44             // '-'在最前 
 45            else if( "-" == strDigit.Substring( 0, 1 ) ) 
 46            { 
 47             strResult.Append( '' ); 
 48             strDigit = strDigit.Substring( 1 ); 
 49            } 
 50             // '+'在最后 
 51            else if( "+" == strDigit.Substring( strDigit.Length - 1, 1 ) ) 
 52            { 
 53             strDigit = strDigit.Substring( 0, strDigit.Length - 1 ); 
 54            } 
 55             // '-'在最后 
 56            else if( "-" == strDigit.Substring( strDigit.Length - 1, 1 ) ) 
 57            { 
 58             strResult.Append( '' ); 
 59             strDigit = strDigit.Substring( 0, strDigit.Length - 1 ); 
 60            } 
 61            // 提取整数和小数部分 
 62            int indexOfPoint; 
 63            if( -1 == ( indexOfPoint = strDigit.IndexOf('.') ) ) // 如果没有小数部分 
 64            { 
 65             strResult.Append( ConvertIntegral( strDigit ) ); 
 66            } 
 67            else // 有小数部分 
 68            { 
 69             // 先转换整数部分 
 70             if( 0 == indexOfPoint ) // 如果“.”是第一个字符 
 71             { 
 72              strResult.Append( '' ); 
 73             } 
 74             else 
 75             { 
 76              strResult.Append( ConvertIntegral( strDigit.Substring( 0, indexOfPoint ) ) ); 
 77             } 
 78             // 再转换小数部分 
 79             if( strDigit.Length - 1 != indexOfPoint ) // 如果“.”不是最后一个字符 
 80             { 
 81              strResult.Append( ''); 
 82              strResult.Append( ConvertFractional( strDigit.Substring( indexOfPoint + 1 ) ) ); 
 83             } 
 84            } 
 85            return strResult.ToString(); 
 86           } 
 87           // 转换整数部分 
 88         protected string ConvertIntegral(string strIntegral) 
 89           { 
 90            // 去掉数字前面所有的'0' 
 91            // 并把数字分割到字符数组中 
 92            char[] integral = ( ( long.Parse( strIntegral ) ).ToString() ).ToCharArray(); 
 93            // 变成中文数字并添加中文数位 
 94            StringBuilder strInt = new StringBuilder(); 
 95            int i; 
 96            int digit; 
 97            digit = integral.Length - 1; 
 98            // 处理最高位到十位的所有数字 
 99            for( i = 0; i < integral.Length - 1; i++ ) 
100            { 
101             strInt.Append( chnText[ integral[i] - '0'] );
102             if( 0 == digit % 4 )     // '万' 或 '亿'
103             {
104              if( 4 == digit || 12 == digit )
105              {
106               strInt.Append( chnDigit[3] ); // '万'
107              }
108              else if( 8 == digit )
109              {
110               strInt.Append( chnDigit[4] ); // '亿'
111              }
112             }
113             else         // '十','百'或'千'
114             {
115              strInt.Append( chnDigit[digit % 4 - 1] );
116             }
117             digit--;
118            }
119            // 如果个位数不是'0'
120            // 或者个位数为‘0’但只有一位数
121            // 则添加相应的中文数字
122            if( '0' != integral[ integral.Length - 1 ] || 1 == integral.Length )
123            {
124             strInt.Append( chnText[ integral[ i ] - '0' ] );
125            }
126          
127            // 遍历整个字符串
128            i = 0;
129            while( i < strInt.Length)
130            {
131             int j = i;
132             
133             bool bDoSomething = false;
134             // 查找所有相连的“零X”结构
135             while( j < strInt.Length - 1 && "" == strInt.ToString().Substring( j, 1 ) )
136             {
137              string strTemp = strInt.ToString().Substring( j + 1, 1 );
138              
139              // 如果是“零万”或者“零亿”则停止查找
140              if( "" == strTemp || "亿" == strTemp )
141              {
142               bDoSomething = true;
143               break;
144              }
145              j += 2;
146             }
147             if( j != i) // 如果找到“零X”结构,则全部删除
148             {
149              strInt = strInt.Remove( i, j - i);
150              // 除了在最尾处,或后面不是"零万"或"零亿"的情况下, 
151              // 其他处均补入一个“零”
152              if(  i <= strInt.Length - 1 && !bDoSomething )
153              {
154               strInt = strInt.Insert( i, '' );
155               i++;
156              }
157             }
158             
159             if( bDoSomething ) // 如果找到"零万"或"零亿"结构
160             {
161              strInt = strInt.Remove( i, 1 ); // 去掉'零'
162              i++;
163              continue;
164             }
165             // 指针每次可移动2位
166             i += 2;
167            }
168            // 遇到“亿万”变成“亿零”或"亿"
169            int index = strInt.ToString().IndexOf( "亿万" );
170            if( -1 != index )
171            {
172             if( strInt.Length - 2 != index &&  // 如果"亿万"不在最后
173              ( index + 2 < strInt.Length && "" != strInt.ToString().Substring( index + 2, 1) ) ) // 并且其后没有"零"
174              strInt = strInt.Replace( "亿万", "亿零", index, 2 );
175             else
176              strInt = strInt.Replace( "亿万", "亿", index, 2);
177            }
178            // 开头为“一十”改为“十”
179            if( strInt.Length > 1 && "一十" == strInt.ToString().Substring( 0, 2 ) )
180            {
181             strInt = strInt.Remove( 0, 1 );
182            }
183            return strInt.ToString();
184           }
185           // 转换小数部分
186         protected string ConvertFractional(string strFractional)
187           {
188               char[] fractional = strFractional.ToCharArray();
189               StringBuilder strFrac = new StringBuilder();
190               // 变成中文数字
191               int i;
192               for (i = 0; i < fractional.Length; i++)
193               {
194                   strFrac.Append(chnText[fractional[i] - '0']);
195               }
196               return strFrac.ToString();
197           }
198 
199     }
200 }

 

posted @ 2013-03-20 16:14  酣睡的熊㊣  阅读(191)  评论(0编辑  收藏  举报