金额转大写

最高到千亿,精确到分

#include <iostream>
#include <string>

using namespace std;

int main() {

	const char* const upperNum[] = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
	const char* const upperStep[] = { "", "万", "亿" };
	const char* const bfPointUnit[] = { "", "拾", "佰", "仟" };

	string temp;
	string coutstr = "";
	cin >> temp;

	int lengthTotal = temp.length();
	int lengthBfPoint = lengthTotal;
	int localPos;
	int pointPos = temp.find('.');
	bool hasZero = false;
	bool hasPoint = false;
	bool zeroPassUnit = true;

	hasPoint = pointPos == -1 ? false : true;
	lengthBfPoint = hasPoint ? pointPos : lengthTotal;

	localPos = lengthBfPoint - 1;
	//转换小数点前数字
	for (int i = 0; i < lengthBfPoint; ++i) {
		int num = temp[i] - char('0');
		if (num == 0)
			hasZero = true;
		else if (num > 0 && hasZero) {
			coutstr += upperNum[0];
			hasZero = false;
		}
		if (num > 0) {
			coutstr = coutstr + upperNum[num] + bfPointUnit[localPos % 4];
			zeroPassUnit = true;
		}

		if (localPos % 4 == 0&&zeroPassUnit) {
			int stepPos = localPos / 4;
			coutstr += upperStep[stepPos];
			zeroPassUnit = false;
		}
		localPos--;
	}
	coutstr += "元";
	if (!hasPoint || pointPos == lengthTotal - 1)
		coutstr += "整";
	else {
		//转换小数点后数字
		int jiao = temp[pointPos + 1] - char('0');
		int fen;
		if (pointPos + 2 < lengthTotal)
			fen = temp[pointPos + 2] - char('0');
		else
			fen = 0;
		if (jiao == 0 && fen == 0)
			coutstr += "整";
		else {
			coutstr = coutstr + upperNum[jiao] + "角";
			if (fen > 0)
				coutstr = coutstr + upperNum[fen] + "分";
		}
	}
	cout << coutstr << endl;
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值