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

  

posted @ 2013-04-23 11:43  岬淢箫声  阅读(611)  评论(0编辑  收藏  举报