C++ 实现小写金额转化为大写金额

C++ 实现小写金额转化为大写金额,第1张

C++ 实现小写金额转化为大写金额 C++ 实现小写金额转化为大写金额

1.目标
输入小写数字字符串
输出大写金额字符串

类似:

2.实现代码与流程
对需要用到的字符:

string stringNum;
string unitInt[] = { "整", "元" };//整数单位
string unit[] = {"仟","", "拾","佰"};
string words[] = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };//大写数字
string unitDecimals[] = { "角", "分" };//小数单位

小数点前后书写规则不一样
(1)小数
首先获得小数位
输入字符串_s 转化为double

double num= atof(_s.c_str());

取整:

int intNum = static_cast (num);

小数部分:

double decimals = num - intNum;t (num);

小数部分的几种情况:

string decimals_s;
	if (num == 0)
	{
		return "";
	}
	if (decimals == 0)//没有小数部分
	{
		decimals_s = unitInt[0];
	}
	else
	{
		int num_01 = decimals / 0.1;
		int num_001 = decimals / 0.01 - 10 * num_01;
		if (num_001 == 0)
		{
			decimals_s = words[num_01] + unitDecimals[0];
		}
		else if (num_01 == 0)
		{
			decimals_s = words[num_001] + unitDecimals[1];
		}
		else
		{
			decimals_s = words[num_01] + unitDecimals[0] + words[num_001] + unitDecimals[1];
		}
	}

此处还需注意 由于二进制的存在,使得double数据的值并不严格等于输入数。

对小数部分四舍五入,保留两位小数

int temp = (int)(decimals * 100 + 0.5);
decimals = temp / 100.0;

(2)整数位
如果整数位0,只输出小数位即可

string int_s;
	if (intNum == 0)
	{
		return  decimals_s;
	}

限定输入金额不超过万亿
会超过int型的限制

int_s = to_string(intNum);//整数部分转化为字符型
int sLength = int_s.length();
if (sLength > 12)//限制输入金额大小,小于万亿
	return "limited num";
for (int i = 0; i< sLength; i++)//对每一位进行转化
{
	stringNum += (words[int_s.at(i) - 48] + unit[(sLength-i)%4]);
	if (i == sLength - 5)
		stringNum += "万";
	if(i == sLength -9)
		stringNum += "亿";
}	


stringNum += unitInt[1];
stringNum += decimals_s;

此时完成功能如下
有多余的零

“零仟”, “零佰”, “零拾” 或者其组合,合并为“零”

string的函数find和replace

找到指定字符串 然后替换

string&   replace_all(string&   str, const   string&   old_value, const   string&   new_value)
{
	while (true) {
		string::size_type   pos(0);
		if ((pos = str.find(old_value)) != string::npos)
			str.replace(pos, old_value.length(), new_value);
		else   break;
	}
	return   str;
}

设定重复的只有一个零,如果最后一位仍为零,则合并为“元”

string cleanZero(const string& _s) {
	// 如果传入的是空串则继续返回空串  
	if ("" == _s) {
		return "";
	}
	string s = _s;
    replace_all(s, "零仟", "零");
	replace_all(s, "零佰", "零");
	replace_all(s, "零拾", "零");
	replace_all(s, "零零", "零");
	replace_all(s, "零元", "元");
	replace_all(s, "零万", "万");
	replace_all(s, "亿万", "亿");
	replace_all(s, "零亿", "亿");

	return s;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5433440.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存