数字转人民币

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数字人民币大写代码 Public Function GetChinaNum(otherNum As Double, Optional isRMB As Boolean, Optional numOption As Boolean, Optional dotNum As Integer) As String On Error Resume Next num = Trim(Str(Int(otherNum))) If isRMB Then numwei = "拾佰仟万拾佰仟亿拾佰仟" numshu = "零壹贰叁肆伍陆柒捌玖拾" Else numwei = "十百千万十百千亿十百千" numshu = "零一二三四五六七八九十" End If If otherNum < 20 And otherNum >= 10 Then num = Right(num, 1) GetChinaNum = Left(numwei, 1) End If For i = 1 To Len(num) bstr = Mid(num, i, 1) If numOption Then GetChinaNum = GetChinaNum + Mid(numshu, Val(bstr) + 1, 1) Else GetChinaNum = GetChinaNum + Mid(numshu, Val(bstr) + 1, 1) If bstr = "0" Then If Mid(numwei, Len(num) - i, 1) = "万" Or Mid(numwei, Len(num) - i, 1) = "亿" Then Do While Right(GetChinaNum, 1) = "零" GetChinaNum = Left(GetChinaNum, Len(GetChinaNum) - 1) Loop GetChinaNum = GetChinaNum + Mid(numwei, Len(num) - i, 1) End If Else GetChinaNum = GetChinaNum + Mid(numwei, Len(num) - i, 1) End If GetChinaNum = Replace(GetChinaNum, "零零", "零") End If Next i If numOption = False Then Do While Right(GetChinaNum, 1) = "零" GetChinaNum = Left(GetChinaNum, Len(GetChinaNum) - 1) Loop End If If isRMB Then numrmb = "元角分" GetChinaNum = GetChinaNum + Mid(numrmb, 1, 1) If Val(num) <> otherNum Then num = Trim(Str(Round(otherNum - Val(num), 2))) For i = 2 To Len(num) bstr = Mid(num, i, 1) GetChinaNum = GetChinaNum + Mid(numshu, Val(bstr) + 1, 1) + Mid(numrmb, i, 1) Next i Else GetChinaNum = GetChinaNum + "整" End If Else If Val(num) <> otherNum Then If dotNum = 0 Then dotNum = 4 num = Trim(CStr(Round(otherNum - Val(num), dotNum))) If GetChinaNum = "" Then GetChinaNum = "零" GetChinaNum = GetChinaNum + "点" For i = 2 To Len(num) bstr = Mid(num, i, 1) GetChinaNum = GetChinaNum + Mid(numshu, Val(bstr) + 1, 1) Next i End If End If End Function

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值