zoukankan      html  css  js  c++  java
  • Unicode版人民币小写金额转大写金额

    转载请注明来源:http://www.cnblogs.com/xuesongshu/

      思路如下:

      1、声明变量:是否负数,是否开头数字是0,
      2、声明变量:最后与取绝对值转换的结果串联
      3、声明变量:大写数字元数据和大写单位元数据
      4、声明变量:绝对值的转换结果,临量变量
      5、如果是负数则取绝对值
      6、格式化,末尾添加1个小数点和2个0
      7、根据字符串长度判断数值,太大则不转
      8、对照元数据查询数字对应的中文大写字符,根据字符的位置插入大写单位
      9、关于零的处理:以适应中文习惯
      10、如果是负数则添加前缀

      代码如下:

    //////////////////////////////////////////////////////////////////////////
    //1、声明变量:是否负数,是否开头数字是0,
    //2、声明变量:最后与取绝对值转换的结果串联
    //3、声明变量:大写数字元数据和大写单位元数据
    //4、声明变量:绝对值的转换结果,临量变量
    //5、如果是负数则取绝对值
    //6、格式化,末尾添加1个小数点和2个0
    //7、根据字符串长度判断数值,太大则不转
    //8、对照元数据查询数字对应的中文大写字符,根据字符的位置插入大写单位
    //9、关于零的处理:以适应中文习惯
    //10、如果是负数则添加前缀
    //////////////////////////////////////////////////////////////////////////
    const LPTSTR RmbToUpper(double dNum)
    {
    	
    	BOOL isNegative=FALSE,isPrevZero=false;
    	TCHAR szFuShu[256]=TEXT("负");
        LPTSTR szRmbNum[10]=
        {
            TEXT("零"),TEXT("壹"),TEXT("贰"),TEXT("叁"),TEXT("肆"),TEXT("伍"),TEXT("陆"),TEXT("柒"),TEXT("捌"),TEXT("玖")
        };
        LPTSTR szRmbUnit[19]=
        {
            TEXT("分"),TEXT("角"),TEXT("."),TEXT("元"),TEXT("拾"),TEXT("佰"),TEXT("仟"),TEXT("万"),TEXT("拾"),TEXT("佰"),TEXT("仟"),TEXT("亿",)
            TEXT("拾"),TEXT("佰"),TEXT("仟"),TEXT("万"),TEXT("拾"),TEXT("佰"),TEXT("仟")
        };
        TCHAR szRmbUpper[256],szRmbTmp[256];
        if(dNum<0)
    	{
    		dNum=abs(dNum);
    		isNegative=TRUE;
    	}
        _stprintf(szRmbTmp,"%.2lf",dNum);
        if(lstrlen(szRmbTmp)>19)
            return NULL;
        int i=lstrlen(szRmbTmp)-1,c;
        LPTSTR srcPtr=szRmbTmp,dstPtr=szRmbUpper;
        for(; *srcPtr; srcPtr++,i--)
        {
            if(*srcPtr=='.')
    			continue;
            c=*srcPtr-'0';
            if(c!=0)
            {
                lstrcpy(dstPtr,szRmbNum[c]);
                dstPtr+=2;
                if(srcPtr==szRmbTmp&&c==1&&lstrcmp(szRmbUnit[i],"拾")==0)
    				dstPtr-=2;
                lstrcpy(dstPtr,szRmbUnit[i]);
                dstPtr+=2;
                isPrevZero=false;
                continue;
            }
            if(isPrevZero)
            {
                if(lstrcmp(szRmbUnit[i],"元")==0||lstrcmp(szRmbUnit[i],"万")==0||lstrcmp(szRmbUnit[i],"亿")==0)
                {
                    dstPtr-=2;
                    *dstPtr=0;
                    if(lstrcmp(dstPtr-2,"亿"))
                    {
                        lstrcpy(dstPtr,szRmbUnit[i]);
                        dstPtr+=2;
                    }
                    isPrevZero=false;
                }
            }
            else
            {
                if(lstrcmp(szRmbUnit[i],"元")&&lstrcmp(szRmbUnit[i],"万")&&lstrcmp(szRmbUnit[i],"亿"))
                {
                    lstrcpy(dstPtr,"零");
                    dstPtr+=2;
                    isPrevZero=true;
                }
                else
                {
                    lstrcpy(dstPtr,szRmbUnit[i]);
                    dstPtr+=2;
                    isPrevZero=false;
                }
            }
        }
        i=lstrlen(szRmbUpper);
        if(lstrcmp(szRmbUpper+i-2,"零")==0)
    		szRmbUpper[i-2]=0;
        szRmbTmp[0]=szRmbUpper[0];
        szRmbTmp[1]=szRmbUpper[1];
        szRmbTmp[2]=0;
        if(lstrcmp(szRmbTmp,"元")==0)
        {
            if(szRmbUpper[2]==0)
    			lstrcpy(szRmbUpper,"零元");
            else
            {
                szRmbTmp[0]=szRmbUpper[2];
                szRmbTmp[1]=szRmbUpper[3];
                szRmbTmp[2]=0;
                return lstrcmp(szRmbTmp,"零")==0?szRmbUpper+4:szRmbUpper+2;
            }
        }
    	if (isNegative)
    	{
    		lstrcat(szFuShu,szRmbUpper);
    		return szFuShu;
    	}
        return szRmbUpper;
    }
    

      

  • 相关阅读:
    set集合 深浅拷贝
    2015 ACM/ICPC Asia Regional Changchun Online Pro 1005 Travel (Krsukal变形)
    2015 ACM/ICPC Asia Regional Changchun Online Pro 1002 Ponds(拓扑排序+并查集)
    Codeforces Round #319 (Div. 2) B Modulo Sum (dp,鸽巢)
    Codeforces Round #319 (Div. 2) C Vasya and Petya's Game (数论)
    UVA 11468 Substring (AC自动机)
    UVA11019 Matrix Matcher (AC自动机)
    UVALive 4670 Dominating Patterns (AC自动机)
    UVALive 3026 Period (KMP算法简介)
    UVA 11732 strcmp() Anyone (Trie+链表)
  • 原文地址:https://www.cnblogs.com/xuesongshu/p/3037354.html
Copyright © 2011-2022 走看看