转载请注明来源:http://blog.csdn.net/caoshiying/article/details/52227581
博客搬家来源:http://www.cnblogs.com/xuesongshu/archive/2013/04/23/3037354.html
思路如下:
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("仟")
};
static 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;
}
建议:函数返回值改为BOOL类型,函数参数加入存储转换结果的字符串参数以及存储区大小,即:
const LPTSTR RmbToUpper(double dNum,TCHCAR* pszRmbUpper,int iMaxCount)