数字转人民币

数字转换人民币大写形式:
银行、单位和个人填写的各种票据和结算凭证需要将数字金额写成人民币大写形式,它的规则主要有以下几条:
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", "元");
}

测试结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值