栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/457925.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号