人民币小写金额转大写金额的算法
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;
}
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;
}
相关文章推荐
- 算法:Unicode版人民币小写金额转大写金额
- .NET把小写数字金额转换成大写人民币金额的两种算法
- C#小写数字金额转换成大写人民币金额的算法
- SQL人民币小写金额转大写
- [转]C#实现人民币金额小写转大写的代码
- Python TIPS上一道关于人民币金额小写转大写的题
- 将小写金额转换成人民币大写金额
- 人民币小写金额转大写金额
- 在excel中人民币小写金额自动转大写金额
- (转)人民币小写金额转大写(SQL)
- 人民币小写金额转大写
- 人民币金额小写转大写
- VC 数字转换为人民币金额大写的简单算法实现
- 人民币小写金额转化成大写金额
- "黑马程序员“将小写金额转换成人民币大写金额
- 人民币小写金额转大写
- Unicode版人民币小写金额转大写金额
- 真正正确的人民币 小写 大写 转换算法
- 人民币小写金额转大写
- 人民币金额小写转大写