zoukankan      html  css  js  c++  java
  • 数字转中文方法(1)

      今天休假,闲来无事,写了一个转数字为中文的程序,暂时时没有处理小数部分,不过处理方法应该差不多。

    思路:

      

    x<1000此处分别对二种情况时进行了处理。0<x<100范围内的转换直接调用ConvertLessThanHundred方法
    0<x<10直接从数组(中文数字)里取

    10<x<100如果为10的倍数,则直接从数组(10的倍数)里找到对应数字的索引,否则分别取出个位与十位再进行合并。
    100<x<999处理方法类似,调用ConvertLessThanHundred方法处理百分位的数字,对于中间有零(904)的数字要特殊处理。

    x>=1000转换方法类似,对于千位以上的数字只不过是递归调用ConvertMoreThanThousand方法来,注意,我每次取四位才进行一次递归,因为每四位数字中间有一个跳位,如 万,亿。

    代码
    public class NumberToCurrency
        {
            
    private string[] majorNames = { """""亿"};
            
    private string[] tenDoubleNams = { """一十""二十""三十""四十""五十""六十""七十""八十""九十" };
            
    private string[] tenNames = { """十一""十二""十三""十四""十五""十六""十七""十八""十九" };
            
    private string[] numberNames = { """""""""""""""""""" };


            
    /// <summary>
            
    /// 转超过1000的数
            
    /// </summary>
            
    /// <param name="number"></param>
            
    /// <returns></returns>
            public string ConvertMoreThanThousand(int number)
            {
                
    //越界
                if (number < 999)
                {
                    
    throw new ArgumentException("number must be greater than 999");
                }
                
    string result = string.Empty;
                
    //处理千分位
                string strNumber = number.ToString();
                
                
    int numLen = strNumber.Length;


                
    int tempNumber = Convert.ToInt32(strNumber.Substring(numLen - 41));   //取千位
                int lessThousand = Convert.ToInt32(strNumber.Substring(numLen - 3));    //千位之后所有位
                result = numberNames[tempNumber] + "";
                
    if(lessThousand == 0)
                {
                    
    //后面全为0
                }
                
    else if(lessThousand<999)   //二位数,要补零
                {
                    result 
    += "" + ConvertLessThanThousand(lessThousand);
                }
                
    else
                {
                    result 
    += ConvertLessThanThousand(lessThousand);
                }
                
                
    //千分位之上的数字,每4位作为一段进行处理
                strNumber = strNumber.Remove(numLen - 4);
                numLen 
    = strNumber.Length;  //重新计算长度
                int index = 1;
                
    string tempCalculate = string.Empty;
                
    while (numLen > 0 && index<majorNames.Length)
                {

                    tempCalculate 
    = strNumber.Substring((numLen - 4> 0 ? numLen - 4 : 0); //最后4位;
                    if (Convert.ToInt32(tempCalculate) < 1000)
                    {
                        tempCalculate 
    = ConvertLessThanThousand(Convert.ToInt32(tempCalculate));
                    }
                    
    else
                    {
                        tempCalculate 
    = ConvertMoreThanThousand(Convert.ToInt32(tempCalculate));
                    }
                    result 
    = tempCalculate + majorNames[index] + result;
                    strNumber 
    = strNumber.Remove((numLen - 4> 0 ? numLen - 4 : 0);
                    numLen 
    = strNumber.Length;
                    index
    ++;
                }
                
                
    return result;
            }

            
    /// <summary>
            
    /// 转小于1000 (0-999) 的数
            
    /// </summary>
            
    /// <param name="number"></param>
            
    /// <returns></returns>
            public string ConvertLessThanThousand(int number)
            {
                
    //越界
                if (number < 0 || number > 999)
                {
                    
    throw new ArgumentException("number must between 0 and 999");
                }
                
    string result = string.Empty;

                
    if (number < 100)
                {
                    
    return ConvertLessThanHundred(number);
                }
                
    else     //大于100 (100-999)
                {
                    
    int tempNumber = number / 100;  //取百位
                    result = numberNames[tempNumber] + "";
                    tempNumber 
    = number - tempNumber * 100//取个位与十位

                    
    if (tempNumber == 0)    //tempNumber==0则就被整除
                    {
                        
    //do nothing
                    }
                    
    else if (tempNumber < 10)    //存在零
                    {
                        result 
    += "" + ConvertLessThanHundred(tempNumber);
                    }
                    
    else
                    {
                        result 
    += ConvertLessThanHundred(tempNumber);
                    }
                }
                
                
    return result;
            }


            
    /// <summary>
            
    /// 转小于100 (0-99) 的数
            
    /// </summary>
            
    /// <param name="number"></param>
            
    /// <returns></returns>
            public  string ConvertLessThanHundred(int number)
            {
                
    //越界
                if (number < 0 || number > 99)
                {
                    
    throw new ArgumentException("number must between 0 and 99");
                }
                
                
    string result = string.Empty;   //存储返回结果
                
    //0-10之间
                if (number < 10)
                {
                    result 
    = numberNames[number];
                }
                
    else    //10-99
                {
                    
    if (number % 10 == 0)   //10的倍数
                    {
                        result 
    = tenDoubleNams[number / 10];
                    }
                    
    else     //非10的倍数
                    {
                        result 
    = tenDoubleNams[number / 10+ numberNames[number % 10]; //分别从十的倍数和数字数组中取
                    }
                }

                
    return result;
            }

        }

    吃饭去了..........

  • 相关阅读:
    古谚、评论与论断、名篇与名言
    重读《西游记》
    重读《西游记》
    命名之法 —— 时间、季节、地点
    命名之法 —— 时间、季节、地点
    文言的理解 —— 古时的称谓、别称、别名
    文言的理解 —— 古时的称谓、别称、别名
    Oracle GoldenGate for Oracle 11g to PostgreSQL 9.2.4 Configuration
    瀑布 敏捷 文档
    POJ 1325 ZOJ 1364 最小覆盖点集
  • 原文地址:https://www.cnblogs.com/repository/p/1786273.html
Copyright © 2011-2022 走看看