数字转人民币

数字转换人民币大写形式:
银行、单位和个人填写的各种票据和结算凭证需要将数字金额写成人民币大写形式,它的规则主要有以下几条:
1、数字和单位使用壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、零、整等字样,不能使用其他汉字;
2、中文大写金额数字到"元"为止的,在"元"之后、应写"整"字;在"角"之后,可以不写"整"字;大写金额数字有"分"的,"分"后面不写"整"字;
3、数字中间有0的,要用汉字零,当数字中间有多个0时,人民币大写形式按口语习惯只保留一个零,如数字30001对应转换结果为“叁万零壹元整”
输入
输入一个数字(长度不超过10位,可能包含2位小数)。
输出
对应人民币大写形式。

#include <stdio.h>
#include <stdbool.h>
#include <math.h>

int main() {

	char *arr[] = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
	double digital;
	int tmp;
	bool flag, flag2;
	while(EOF != scanf("%lf", &digital)) {
        printf("人民币");
		flag = false;
		flag2 = false;
		tmp = (int)digital;
		if(tmp >= 100000000) {
			tmp /= 100000000;
			if(tmp >= 10) {
				printf("%s拾", arr[tmp/10]);
			}
			printf("%s亿", arr[tmp%10]);
			flag = true;
		}
		tmp = (int)digital % 100000000;
		if(tmp >= 10000) {
			tmp /= 10000;
			if(tmp >= 1000) {
				printf("%s仟", arr[tmp/1000]);
				tmp %= 1000;
				flag = true;
			} else {
				if(flag) {
					flag2 = true;
				}
			}
			if(tmp >= 100) {
				if(flag2) {
					printf("零");
					flag2 = false;
				}
				printf("%s佰", arr[tmp/100]);
				tmp %= 100;
				flag = true;
			} else {
				if(flag) {
					flag2 = true;
				}
			}
			if(tmp >= 10) {
				if(flag2) {
					printf("零");
					flag2 = false;
				}
				printf("%s拾", arr[tmp/10]);
				tmp %= 10;
				flag = true;
			} else {
				if(flag) {
					flag2 = true;
				}
			}
			if(tmp > 0) {
				if(flag2) {
					printf("零");
					flag2 = false;
				}
				printf("%s", arr[tmp]);
			}  
			printf("万");
			flag = true;
		}
		tmp = (int)digital % 10000;
		if(tmp >= 1000) {
			printf("%s仟", arr[tmp/1000]);
			tmp %= 1000;
			flag = true;
		} else {
			if(flag) {
				flag2 = true;
			}
		}
		if(tmp >= 100) {
			if(flag2) {
				printf("零");
				flag2 = false;
			}
			printf("%s佰", arr[tmp/100]);
			tmp %= 100;
			flag = true;
		} else {
			if(flag) {
				flag2 = true;
			}
		}
		if(tmp >= 10) {
			if(flag2) {
				printf("零");
				flag2 = false;
			}
            if(!flag && (tmp/10 == 1))
                printf("拾");
            else
			    printf("%s拾", arr[tmp/10]);
			tmp %= 10;
			flag = true;
		} else {
			if(flag) {
				flag2 = true;
			}
		}
		if(tmp > 0) {
			if(flag2) {
				printf("零");
				flag2 = false;
			}
			printf("%s", arr[tmp]);
            flag = true;
		}
        if(flag)
		    printf("元");

		double inta = 100 * digital;
		//printf("%lf, %d ", inta, (int)digital*100);
		tmp = inta - (int)digital * 100;
		//printf("%lf, %d ", inta, tmp);
		//printf("%lf ", fabs(inta - (int)digital * 100 - tmp));
		if(fabs(inta - (int)digital * 100 - tmp)>0.01) {
			//printf("%d ", tmp);
			tmp += 1;
			//printf("%d ", tmp);
		}
		if(tmp >= 1) {
			if(tmp >= 10) {
				printf("%s角", arr[tmp/10]);
			} else {
				printf("零");
			}
			if(tmp % 10 > 0)
				printf("%s分\n", arr[tmp%10]);
			else
				printf("\n");
		} else {
			printf("整\n");
		}
	}

	return 0;
}


环境ubuntu下必须用fabs
很烦人的一题,之前的结果由于浮点数的原因,结果总是差0.01

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值