欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

大小写金额转换

程序员文章站 2022-07-15 09:34:47
...

大小写金额转换

在实际工作中,当我们填写人民币数据时,比如报销差旅费、打欠条,就需要使用大写金额书写,有时候需要把一系列表格中的小写金额转换为大写,这就是大小写金额转换,例如,10 802.54的大写金额为:壹万零捌仟元伍角肆分。
【分析】
将小写金额转换为大写金额的方法如下。
(1)求出小写金额对应的整数位数和小数位数。
(2)分别将整数部分和小数部分转换为大写金额,即把阿拉伯数字“0123456789"分别转换为"零壹贰叁肆伍陆柒捌玖",并加上人民币的货币单位“分角元拾佰仟万拾佰仟亿拾佰仟万”。

将整数部分转换为大写金额时,若整数部分的某位数字为0,还需要分以下几种情况进行处理:①第-一位数字为0, 若第二位不是:或后面仍有其他字符,则输入有误:否则,输出“零元”。②若为0的数字不是第一位,且不是亿、万、元位,则需要输出“零”;如果是亿、万、元位,则需要增加人民币单位。

其他情况直接将阿拉伯数字转换为大写金额,并输出货币单位。
在转换小数部分时,当某位数为0,若该位是小数点后第一位,则输出“零”:若小数点第一 位和第二位都为0,则输出“整”。其他情况则直接将阿拉伯数字转换为大写金额,并输出货币单位。

code:
 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <iostream>
#define N 30 
void rmb_units(int k);
void big_write_num(int l);
void main()
{
	char c[N], *p;
	int a, i, j, len, len_integer = 0, len_decimal = 0;   //len_integer整数部分长度,len_decimal小数部分长度
	printf("*************************************************\n");
	printf("  本程序是将阿拉伯数字小写金额转换成中文大写金额!\n");
	printf("*************************************************\n");
	printf("请输入阿拉伯数字小写金额: ¥");
	scanf("%s", c);
	printf("\n");
	p = c;
	len = strlen(p);
	/*求出整数部分的长度*/
	for (i = 0; i <= len - 1 && *(p + i) <= '9' && *(p + i) >= '0'; i++);
	if (*(p + i) == '.' || *(p + i) == '\0')   //*(p+i)=='\0'没小数点的情况
		len_integer = i;
	else
	{
		printf("\n输入有误,整数部分含有错误的字符!\n");
		exit(-1);
	}
	if (len_integer>13)
	{
		printf("超过范围,最大万亿!整数部分最多13位!\n");
		printf("程序继续执行,注意:超过万亿部分只读出数字的中文大写!\n");
	}
	printf("¥%s 的大写金额:", c);
	/*转换整数部分*/
	for (i = 0; i<len_integer; i++)
	{
		a = *(p + i) - '0';
		if (a == 0)
		{
			if (i == 0)
			{
				if (*(p + 1) != '.' && *(p + 1) != '\0' && *(p + 1) != '0')
				{
					printf("\n输入有误!第一位后整数部分有非法字符,请检查!\n");
					printf("程序继续执行,注意:整数部分的剩下部分将被忽略!\n");
				}
				printf("零元");
				break;
			}
			else if (*(p + i + 1) != '0' && i != len_integer - 5 && i != len_integer - 1 && i != len_integer - 9) //元万亿位为0时选择不加零                           
			{
				printf("零");
				continue;
			}
			else if (i == len_integer - 1 || i == len_integer - 5 || i == len_integer - 9)   //元万亿单位不能掉
			{
				rmb_units(len_integer + 1 - i);
				continue;
			}
			else
				continue;
		}
		big_write_num(a);          //阿拉伯数字中文大写输出
		rmb_units(len_integer + 1 - i);   //人民币货币单位中文大写输出
	}
	/*求出小数部分的长度*/
	len_decimal = len - len_integer - 1;
	if (len_decimal<0)//若只有整数部分,则在最后输出“整”
	{
		len_decimal = 0;
		printf("整");
	}
	if (len_decimal>2)      //只取两位小数
		len_decimal = 2;
	p = c;
	/*转换小数部分*/
	for (j = 0; j<len_decimal; j++)
	{
		a = *(p + len_integer + 1 + j) - '0'; //定位到小数部分,等价于a=*(p+len-len_decimal+j)-'0'; 
		if (a<0 || a>9)
		{
			printf("\n输入有误,小数部分含有错误的字符!\n");
			system("pause");
			exit(-1);
		}
		if (a == 0)
		{
			if (j + 1<len_decimal)
			{
				if (*(p + len_integer + j + 2) != '0')
					printf("零");
				else
				{
					printf("整");
					break;
				}
			}
			continue;
		}
		big_write_num(a);
		rmb_units(1 - j);
	}
	printf("\n\n");

	system("pause");
}
/*人民币货币单位中文大写输出*/
void rmb_units(int k)
{
	//相当于const char rmb_units[]="fjysbqwsbqisbqw";
	//"分角元拾佰仟万拾佰仟亿拾佰仟万";
	switch (k)
	{
	case 3:case 7:case 11: printf("拾"); break;
	case 4:case 8:case 12: printf("佰"); break;
	case 5:case 9:case 13: printf("仟"); break;
	case 6: case 14:       printf("万"); break;
	case 10:               printf("亿"); break;
	case 2:                printf("元"); break;
	case 1:                printf("角"); break;
	case 0:                printf("分"); break;
	default:               break;
	}
}
/*阿拉伯数字中文大写输出*/
void big_write_num(int l)
{
	//相当于const char big_write_num[]="0123456789";
	//"零壹贰叁肆伍陆柒捌玖"
	switch (l)
	{
	case 0:printf("零"); break;
	case 1:printf("壹"); break;
	case 2:printf("贰"); break;
	case 3:printf("叁"); break;
	case 4:printf("肆"); break;
	case 5:printf("伍"); break;
	case 6:printf("陆"); break;
	case 7:printf("柒"); break;
	case 8:printf("捌"); break;
	case 9:printf("玖"); break;
	default:break;
	}
}

结果:

大小写金额转换