将数字转为中文金额的大写方式(c++)

calc.h

#if  defined   NDEBUG
#define   assert(condition)   ((void0
#else 
#define assert(condition) _assert((condition),  condition,  __FILE__,  __LINE__

#include <iostream>
#include <vector>
#include <iterator>
#include <math.h>

using namespace std;

using iter= vector<string>::const_iterator;

void Convert(const long double& money);
void ConvertDecimal(const long double &money);      
//转换小数部分

void CleanZero(vector<string>& v1, vector<string>& v2, const int &length);
//消零后输出,函数内调用PrintInteger

bool PrintInteger(iter iter1, iter iter2, iter end);
//除元,萬,亿外,输出整数部分及单位

void test();

#endif

calc.cpp

#include "calc.h"

//v1用于保存数值 即数组a中的数,v2则用于保存单位 即数组b中的数
void Convert(const long double &money)
{
	vector<string> v1, v2;
	int length;

    const string a[] = { "零","壹","贰","叁","肆","伍","陆","柒","捌","玖" };      
	//注意:数组下标从零开始

	const string b[] = { "","拾","佰","仟","",       //个位到一万位   
		                 "拾","佰","仟","",          //十万位到千万位
	                     "拾","佰","仟", };          //十亿位到千亿位 
	
	//元,萬,亿不存储在vector中,在其他函数中输出
	//以防止在消零函数中不输出单位元,萬,亿的情况,如10 0001

	if (money == 0)
	{
		cout << "零元" << endl;
		return;
	}
	else if (money < 0)
	{
		cout << "所转换的金额必须大于0!" << endl;
		return;
	}
	else if (money < 1)
		length = 0;          //像0.3这样的数字将其位数定义为0
	else
		length = static_cast<int>(log10(money)) + 1;         //位数
	//money必须>=0
	
	int len = length;
	for (; len; --len)          //len用于控制循环次数,进而防止循环改变length的值
	{
		long long t = static_cast<long long>(money) / pow(10, len - 1);
		v1.push_back(a[t % 10]);              //逆序进入,位数高的在前面
		v2.push_back(b[len - 1]);  
	}
	
	CleanZero(v1, v2, length);   //消零后输出
	ConvertDecimal(money);     //输出小数部分
	cout << endl;
	
}

void ConvertDecimal(const long double &money)
{
	long long integer = static_cast<long long>(money);
	double decimal = money - integer;                  //小数部分
	const string a[] = { "零","壹","贰","叁","肆","伍","陆","柒","捌","玖" };

	if (decimal != 0)
	{
		int t = static_cast<int>(decimal * 10);
		if (t != 0)
		{
			cout << a[t] << "角";
		}
		t = (static_cast<int>((decimal) * 100) % 10);
		if (t != 0)
			cout << a[t] << "分";
	}
}

void CleanZero(vector<string>& v1, vector<string>& v2,const int &length)
{
	int t;
	if (length == 0)
		cout << "";    
	//money==0的情况已经在Convert函数中讨论过了,此时length为0指像0.3的数字

	else if (length >= 13)
		cout << "金额数量太大!" << endl;
	else if (length>=9)
	{
		t = length - 8;
		PrintInteger(v1.begin(), v2.begin(), v1.begin()+t);
		cout << "亿";
		//9到12位的数字不可能都为零,否则数字位数length不可能>=9

		if (PrintInteger(v1.begin() + t, v2.begin() + t, v1.begin() + t + 4))
			cout << "萬";
		//if语句用于判断5到8位数字是否都为零
		//若都为零,则不输出 "萬"

		PrintInteger(v1.begin() + t + 4, v2.begin() + t + 4, v1.end());
		cout << "元";
		//不论1到4位的数字是否都为零,"元"都要输出
	}
	else if(length>=5)
	{
		int t = length - 4;
		PrintInteger(v1.begin(), v2.begin(), v1.begin() + t);
			cout << "萬";
		PrintInteger(v1.begin() + t, v2.begin() + t, v1.end());
		cout << "元";
	}
	else
	{
		PrintInteger(v1.begin(), v2.begin(), v1.end());
		cout << "元";
	}
}

//iter1为类型别名,指vector<string>::const_iterator
bool PrintInteger(iter iter1, iter iter2, iter end)
{
	bool flag = true;     
	//falg用于判断这四个数字是否都为零,若在万位的数字为零,即falg为false,则"萬"不输出
	
	if ((*iter1 == "零") && (*(iter1 + 1) == "零") && (*(iter1 + 2) == "零") && (*(iter1 + 3) == "零"))
		flag = false;
	else
	{
		while (iter1 != end)             //v1,v2所存储的元素个数一样
		{
			if (*iter1 != "零")
				cout << *(iter1++) << *(iter2++);
			else if ((*iter1 == "零") && ((iter1 + 1) == end))
			{
				++iter1;
				++iter2;
			}
			else if ((*iter1 == "零") && ((iter1 + 1) != end) && (*(iter1 + 1) != "零"))
			{
				cout << *(iter1++);
				++iter2;
			}
			else if ((*iter1 == "零") && ((iter1 + 2) == end) && (*(iter1 + 1) == "零"))
			{
				iter1 += 2;
				iter2 += 2;
			}

			else if ((*iter1 == "零") && ((iter1 + 2) != end) && (*(iter1 + 1) == "零") && (*(iter1 + 2) != "零"))
			{
				cout << *iter1;
				iter1 += 2;
				iter2 += 2;
			}
			else if ((*iter1 == "零") && ((iter1 + 3) == end) && (*(iter1 + 1) == "零") && (*(iter1 + 2) == "零"))
			{
				iter1 += 3;
				iter2 += 3;
			}
			else if ((*iter1 == "零") && ((iter1 + 3) != end) && (*(iter1 + 1) == "零") && (*(iter1 + 2) == "零"))
			{
				cout << *iter1;
				iter1 += 3;
				iter2 += 3;
			}
		}
	}
	return flag;
}

test.cpp

#include "calc.h"

void test()
{
	cout << "1024:";
	Convert(1024);
	cout << "1000.07:";
	Convert(1000.07);
	cout << "100001111:";
	Convert(100001111);
	cout << "10000:";
	Convert(10000);
	cout << "12300:";
	Convert(12300);
	cout << "1002001:";
	Convert(1002001);
	cout << "0:";
	Convert(0);
	cout << "3.12:";
	Convert(3.12);
	cout << "6.09:";
	Convert(6.09);
	cout << "8.50:";
	Convert(8.50);
	cout << "3.00:";
	Convert(3.00);
}

main.cpp

#include "calc.h"

int main()
{
	test();
	return 0;
}
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值