zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    整数因子分解问题(递归分治法、动态规划)
    背包问题(动态规划 C/C++)
    划分问题(Java 动态规划)
    算法:Common Subsequence(动态规划 Java 最长子序列)
    算法:矩阵连乘(Java)动态规划
    Frogs‘ Neighborhood(POJ 1659 C/C++)
    算法:线性时间选择(C/C++)
    sort(hdu oj 1425)计数排序和快速排序
    快速排序(递归和分治)
    a^b(取模运算)
  • 原文地址:https://www.cnblogs.com/pyffcwj/p/2971378.html
Copyright © 2011-2022 走看看