您的位置:首页 > 其它

人民币小写金额转大写金额的算法

2009-03-11 16:21 295 查看
因为项目的需要,前段时间在网上找了个人民币小写金额转大写金额的一个C算法实现,结果发现有很多的错误,因此决定自己实现一个,代码如下:

char* chineseFee( char* dest, char* src )
{
static const char *NumberChar[] = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
static const char *UnitChar[] =
{
"整", "分", "角", "圆", // 0 - 3
"拾", "佰", "仟", "万", // 4 - 7
"拾", "佰", "仟", "亿", // 8 - 11
"拾", "佰", "仟", "兆", // 12 - 15
"拾", "佰", "仟", "京" // 16 - 19
};
dest[0] = '/0';
//编译的二进制码
char code[128];
int cLen = 0;
int cUnit= 2; //初始化为角
int nDot = 0;
int ndec = 0;
//第一遍编译
for(;*src != '/0' ;++src)
{
if( *src >= '0' && *src<= '9')
{
code[cLen++] = *src- '0';
if(!nDot) ++cUnit;
else if(nDot) ++ndec;
}
else if(*src == '.')
{
code[cLen++] = -1;
++nDot;
}
else
{
return dest;
}
}
if(nDot >1 || ndec > 2 || cUnit >19 || cLen == 0)
{
return dest;
}

//第二遍编译
int nZero = 0;
int nValid = 0;
char *p= dest;
for(int n = 0;n< cLen;++n)
{
if(code
== 0)
{
//对于基点单位要输出
if(nValid && (nZero <3 && cUnit %4 == 3) )
{
strncpy(p,UnitChar[cUnit],2);
p+=2;
}

++nZero;
--cUnit;
}
else if(code
!= -1)
{
//在输入有效数据时,输出0
if(nValid && nZero > 0)
{
strncpy(p,NumberChar[0],2);
p+=2;
}
nZero = 0;

//输出有效数据
strncpy(p,NumberChar[code
],2);
p+=2;
strncpy(p,UnitChar[cUnit--],2);
p+=2;

//有效位增加
++nValid;
}
else
{
//这个时候可以输出"园"
if(nZero>3)
{
strncpy(p,UnitChar[3],2);
p+=2;
}
nZero = 0;
}
}
//如果没有有效数据,全部是0,则补一个0
if(nValid == 0 && nZero> 0)
{
strncpy(p,NumberChar[0],2);
p+=2;
}

//输出单位“圆”
if(nValid == 0 || nZero>3)
{
strncpy(p,UnitChar[3],2);
p+=2;
}

//判断是否需要输出“整”
//如果小数位0,结尾是2个0,或者结尾是一个0但是只有一个小数
if(ndec == 0 || nZero == 2 || ( nZero == 1 && ndec == 1) )
{
strncpy(p,UnitChar[0],2);
p+=2;
}

*p = '/0';
return dest;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: