惭愧,大写金额不会写。网上找了大写金额的规则如下:
(一) 阿拉伯数字中间有“0”时,中文大写金额中间可以只写一个“零”字。如¥1,409.50,应写成人民币壹仟肆佰零玖元伍角。
(二) 阿拉伯数字中间连续有几个“0”,中文大写金额中间可以只写一个“零”字,如¥6,007.14,应写成人民币陆仟零柒元壹角肆分。
(三) 阿拉伯金额数字万位或元位是“0”,或者数字中间连续有几个“0”,万位、元位也是“0”,但仟位、角位不是“0”时,中文大写金额中可以只写一个零字,也可以不写“零”字,如¥1,680.32,应写成人民币壹仟陆佰捌拾元零三角贰分,或者写成人民币壹仟陆佰捌拾元三角贰分;又如¥107,000.53,应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万柒仟元伍角叁分。
(四) 阿拉伯金额数字角位是“0”,而分位不是“0”时,中文大写金额“元”后面应写“零”字。如¥16,409.02,应写成人民币壹万陆仟肆佰零玖元零贰分;又如¥325.04,应写成人民币叁佰贰拾元零肆分。
于是写了个小程序辅助一下,程序截图:
注意:金额保留到小数点后2位;double精度限制,如果数字输入太大,将会出现舍入。
转换函数:
CString ToBigNum(double dVal)
{
CString sRet = "";
if(dVal < 0)
{
dVal = -dVal;
sRet += "负";
}
CString sNums[] =
{
"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"
};
CString sUnit[] =
{
"", "拾", "佰", "仟"
};
char buffer[1024];
sprintf(buffer, "%.2lf", dVal);
int l = (int)strlen(buffer) - 3;
int i;
int z = 0, n = 0, y = 0;
for(i = 0; i < l; i++)
{
if(buffer[i] == '0')
{
z = 1;
}
else
{
if(z == 1)
{
sRet += "零";
z = 0;
}
n = 1;
y = 1;
sRet += sNums[buffer[i] - '0'];
sRet += sUnit[(l - i - 1) % 4];
}
if(0 == l - i - 1)
{
}
else if(0 == (l - i - 1) % 8)
{
sRet += "亿";
n = 0;
}
else if(0 == (l - i - 1) % 4)
{
if(n != 0)
{
sRet += "万";
}
}
}
if(y == 1)
{
sRet += "圆";
}
i++;
if(buffer[i] == '0')
{
if(buffer[i + 1] == '0')
{
if(y != 1)
{
sRet += "零圆";
}
sRet += "整";
}
else
{
if(y == 1)
{
sRet += "零";
}
}
}
else
{
if(y == 1 && z == 1)
{
sRet += "零";
}
sRet += sNums[buffer[i] - '0'];
sRet += "角";
}
if(buffer[i + 1] != '0')
{
sRet += sNums[buffer[i + 1] - '0'];
sRet += "分";
}
return sRet;
}
程序下载
评论