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 }