calc.h
#if defined NDEBUG
#define assert(condition) ((void) 0)
#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;
}