【金额转换】阿拉伯数字金额转中文面额

文章提供了一个C++程序,该程序将大数字转换为中文数字,考虑了中文数字的习惯读法,包括四位分块、填充零和单位(如万、亿)的使用。程序通过两个主要函数实现,`stringValueToChs`处理单个四位数字,`DenomValueToChs`处理整串数字并进行四位分块。程序可以处理从零到兆的数字,并能正确填充零。
摘要由CSDN通过智能技术生成

逻辑:
1、将每串数字每四位分为一块(中文习惯喜欢四位四位读)
2、将这四位填充千百十个
3、按照当前的位置,填充万,十万等单位
4、拼接

比较麻烦的是按照习惯填充零的那部分

版本

#include <iostream>
#include <string>

const std::string NumberChs[10] = { "零","壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
const std::string UnitChs[3] = { "拾","佰","仟"};
const std::string UnitChs_2[4] = { "萬", "亿", "萬亿","兆"};
#define GetNumChs(a) ((a<_countof(NumberChs))?NumberChs[a]:"")
#define GetUnitChs(a) ((a<_countof(UnitChs))?UnitChs[a]:"")
#define GetUnitChs2(a) ((a<_countof(UnitChs_2))?UnitChs_2[a]:"")

std::string ValueToChs(unsigned long long value, int & last_num)
{
	int value_length = 4;	//每次都计算四位,防止类似10001却只计算了1导致零没填充
	std::string _denom_chs;
	unsigned long long _value = value;

	int _last_num_tmp = last_num==-1?-1:1;//不继承上一部分的最后一位
	while (value_length != 0)
	{
		value_length = value_length - 1;
		int pow_value = pow((float)10, value_length); // 取最高位
		unsigned long long  num = _value / pow_value;
		_value = _value % pow_value;	//去掉最高位,用于逐位转换
		std::string _num_chs = GetNumChs(num);
		if (num == 0)
		{
			if (_last_num_tmp != -1)	//当不是-1即不是开头的时候才去更新_last_num
				_last_num_tmp = num;
			continue;
		}

		_num_chs = _num_chs + GetUnitChs(value_length - 1);
		if (_last_num_tmp == 0 && num != 0)	 //当前位不为0并且前面为0,表示需要填充0
		{
			_last_num_tmp = num;
			_denom_chs = _denom_chs + GetNumChs(0) + _num_chs;
			continue;
		}
		_last_num_tmp = num;
		_denom_chs = _denom_chs + _num_chs;
	}
	last_num = _last_num_tmp;	//更新last_num为最后一位的值
	return _denom_chs;

}

std::string DenomValueToChs(unsigned long long  value)
{
	int unit = (std::to_string(value).length() - 1) / 4;		//整串数字 每四位 分一块
	unsigned long long _value = value;
	std::string _denom_chs;
	int last_num = -1;	//必须初始化为负数,否则会判断为有效位故在前面加零
	while (_value != 0)
	{
		unsigned long long  _pow_value = pow((float)10000, unit--);
		unsigned long long  tmp_value = _value / _pow_value;
		if (tmp_value <= 0){
			last_num = 0;
			continue;
		}
		_denom_chs = _denom_chs + ValueToChs(tmp_value, last_num) + GetUnitChs2(unit);
		_value = _value %_pow_value;	// 去掉已经计算过的位数
	}
	return _denom_chs;
}
int main()
{
	unsigned long long value = 0;
	while (true){
		std::cin >> value;
		std::cout << "输入:" << value << std::endl;
		std::cout << "转换后:" << DenomValueToChs(value) << std::endl;;
	}

	//ValueToChs(1124);
}

版本二 (改了一下参数)

#include <iostream>
#include <string>

const std::string NumberChs[10] = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
const std::string UnitChs[3] = { "拾", "佰", "仟" };
const std::string UnitChs_2[4] = { "萬", "亿", "萬亿", "兆" };
#define GetNumChs(a) ((a<_countof(NumberChs))?NumberChs[a]:"")
#define GetUnitChs(a) ((a<_countof(UnitChs))?UnitChs[a]:"")
#define GetUnitChs2(a) ((a<_countof(UnitChs_2))?UnitChs_2[a]:"")

std::string ValueToChs(unsigned long long value, bool is_begin )
{
	int value_length = 4;	//每次都计算四位,防止类似10001却只计算了1导致零没填充
	std::string _denom_chs;
	unsigned long long _value = value;

	int _last_num_tmp = -1;
	while (value_length != 0)
	{
		value_length = value_length - 1;
		int pow_value = pow((float)10, value_length); // 取最高位
		unsigned long long  num = _value / pow_value;
		_value = _value % pow_value;	//去掉最高位,用于逐位转换
		std::string _num_chs = GetNumChs(num);
		if (num == 0)
		{
			if (!is_begin)	//当不是整串字符串开头的时候会更新last_num_tmp
				_last_num_tmp = num;
			continue;
		}

		_num_chs = _num_chs + GetUnitChs(value_length - 1);
		if (!is_begin && (_last_num_tmp == 0 && num != 0))	 //当前位不为0并且前面为0,表示需要填充0
		{
			_last_num_tmp = num;
			_denom_chs = _denom_chs + GetNumChs(0) + _num_chs;
			continue;
		}
		_last_num_tmp = num;
		_denom_chs = _denom_chs + _num_chs;
	}
	return _denom_chs;

}

std::string DenomValueToChs(unsigned long long  value)
{
	int unit = (std::to_string(value).length() - 1) / 4;		//整串数字 每四位 分一块
	unsigned long long _value = value;
	std::string _denom_chs;
	bool is_begin = true;
	while (_value != 0)
	{
		unsigned long long  _pow_value = pow((float)10000, unit--);
		unsigned long long  tmp_value = _value / _pow_value;
		if (tmp_value <= 0){
			continue;
		}
		_denom_chs = _denom_chs + ValueToChs(tmp_value, is_begin) + GetUnitChs2(unit);
		_value = _value %_pow_value;	// 去掉已经计算过的位数
		is_begin = false;
	}
	return _denom_chs;
}
int main()
{
	unsigned long long value = 0;
	while (true){
		std::cin >> value;
		std::cout << "输入:" << value << std::endl;
		std::cout << "转换后:" << DenomValueToChs(value) << std::endl;;
	}

	//ValueToChs(1124);
}

运行结果

在这里插入图片描述

Tips:目前自测到亿单位

如果有人测出问题麻烦留言评论下有问题的数字,我会优化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值