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;
            }

        }

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

  • 相关阅读:
    【AtCoder】ARC067 F
    【AtCoder】ARC095 E
    【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值
    【CodeForces】961 F. k-substrings 字符串哈希+二分
    【CodeForces】961 G. Partitions 斯特林数
    【BZOJ】2310: ParkII 插头DP
    【BZOJ】2331: [SCOI2011]地板 插头DP
    webpack从0开始---(二)
    webpack从0开始---(一)
    前端基础知识(不应需要思考的知识点)三
  • 原文地址:https://www.cnblogs.com/repository/p/1786273.html
Copyright © 2011-2022 走看看