数字转换人民币大写形式:
银行、单位和个人填写的各种票据和结算凭证需要将数字金额写成人民币大写形式,它的规则主要有以下几条:
1、数字和单位使用壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、零、整等字样,不能使用其他汉字;
2、中文大写金额数字到"元"为止的,在"元"之后、应写"整"字;在"角"之后,可以不写"整"字;大写金额数字有"分"的,"分"后面不写"整"字;
3、数字中间有0的,要用汉字零,当数字中间有多个0时,人民币大写形式按口语习惯只保留一个零,如数字30001对应转换结果为“叁万零壹元整”
输入:
100.05
300702.23
9000800
输出:
壹佰元零伍分
叁拾万零柒佰零贰元贰角叁分
玖佰万零捌佰元整
实现代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define STR2INT(ch) ((ch)-48)
char *split(const char *src, char *dst, char ch, int *posOfCh);
void printNoDecimal(char money[]);
void printWithDecimal(char money[]);
/*数字数组*/
char number[][4] = {"零", "壹", "贰", "叁", "肆", "伍", "陆","柒", "捌", "玖"};
int main()
{
char money[11]; /*长度不超过10位,可能包含2位小数*/
memset(money, 0, 11);
while(scanf("%s", money) != EOF)
{
/*查找money字符串里是否包含'.'*/
if(strchr(money, '.')){ /*非整元情况*/
printWithDecimal(money);
printf("\n");
}else{ /*整元情况*/
printNoDecimal(money);
printf("%s\n", "整");
}
memset(money, 0, 11);
}
}
char *split(const char *src, char *dst, char ch, int *posOfCh)
{
*posOfCh = 0;
while(*src != ch){
*dst++ = *src++;
(*posOfCh)++;
}
*dst = '\0';
return dst;
}
void printWithDecimal(char money[])
{
char integerPart[11];
char decimalPart[3];
int indexOfSplitPos = 0;
memset(integerPart, 0, 11);
memset(decimalPart, 0, 3);
/*获取整数部分*/
split(money, integerPart, '.', &indexOfSplitPos);
printNoDecimal(integerPart);
/*获取小数部分*/
if(strlen(money) - indexOfSplitPos == 3){ /*2位小数的情况*/
decimalPart[0] = money[indexOfSplitPos + 1];
decimalPart[1] = money[indexOfSplitPos + 2];
if(STR2INT(decimalPart[0]) == 0){ /*十分位*/
printf("%s", number[STR2INT(decimalPart[0])]);
}else{
printf("%s", number[STR2INT(decimalPart[0])]);
printf("%s", "角");
}
if(STR2INT(decimalPart[1]) != 0){ /*百分位*/
printf("%s", number[STR2INT(decimalPart[1])]);
printf("%s", "分");
}
}
else{ /*1位小数的情况*/
decimalPart[0] = money[indexOfSplitPos + 1];
if(STR2INT(decimalPart[0]) != 0){ /*十分位*/
printf("%s", number[STR2INT(decimalPart[0])]);
printf("%s", "角");
}
}
}
void printNoDecimal(char money[])
{
int strLen = strlen(money);
int num = 0;
int isZeroFlag = 0;
for(int i = 0; i < strLen; i++)
{
num = STR2INT(money[i]); /*字符转整数*/
if(num == 0){ /*连0的情况只输出一个'零'*/
isZeroFlag = 1;
if(9 == (strLen - i))
printf("%s", "亿");
if(5 == (strLen - i))
printf("%s", "万");
continue;
}else{
if(1 == isZeroFlag){
printf("%s", "零");
}
printf("%s", number[num]);
if(0 == ((strLen - i - 2) % 4))
printf("%s", "拾");
else if(0 == ((strLen - i - 3) % 4))
printf("%s", "佰");
else if(0 == ((strLen - i - 4) % 4))
printf("%s", "仟");
/*输出单位*/
if(9 == (strLen - i))
printf("%s", "亿");
if(5 == (strLen - i))
printf("%s", "万");
}
}
printf("%s", "元");
}
测试结果: