阿拉伯数字转换成中文数字 C++

数字转化成大写汉字有着很广泛的应用,比如银行系统,比如语音导航系统等。

处理数字转换成汉字的过程中,主要是完成权值和数字的转换,在我国使用的权值一般是按照4位一段进行读取的,也就是万、亿、万亿等,但是每一段中还有更小的权值:千、百、十。所有数字转换成汉字的程序需要处理好段的权值和每段中的每个数字之间的权值问题。

具体的算法过程:
1.首先根据数字截取4位一段的数字段;
2.判断每段数字位所在的数字和权值;
3.处理好0的读取:
a.以每段作为判断标准小节,小节的结尾即使是0,也不使用零,即也不读出零
b.小节内两个非0数字之间要使用零
c.当小节的千位是0时,若本小节的前一小节无其他数字,则不用零,否则实用零。

以下是自己写的一个实例,仅供参考:

#pragma once
#include <QString>
#include <QVector>
//数字转换成汉字

#define NUMBER_COUNT 10//数字数量
#define SECTION_COUNT 4//权值数量
#define BIT_COUNT 4//位数量

typedef struct tagSection {
	QString sectionNameStr;//权位
	int num;//权位值
}NumSection;

class DigitalToChinese {
public:
	DigitalToChinese();
	~DigitalToChinese();

	//数字转换成对应的汉字
	QString digitalToChinese(long long num);

private:
	QString bitSection(int num,bool bHead);//把每一段转换成汉字
	QString IntelSec(QVector<NumSection>&sectionList, int readNum);
	QString IntelSecZero(QVector<NumSection>&sectionList);
private:
	const char* _chineseNumber[NUMBER_COUNT] = { "零","一","二" ,"三" ,"四" ,"五" ,"六" ,"七" ,"八" ,"九" };
	const char* _section[SECTION_COUNT] = { "","万","亿","万亿" };
	const char* _bit[BIT_COUNT] = { "","十","百","千" };

	long long _converNum = 0;

	QVector<NumSection> _sectionList;//
};


#include "DigitalToChinese.h"

DigitalToChinese::DigitalToChinese() {
}

DigitalToChinese::~DigitalToChinese() {
}

QString DigitalToChinese::digitalToChinese(long long num) {
	QString numStr;
	if (num < 0){//处理负值
		numStr = QStringLiteral("负");
	}
	_converNum = abs(num);

	int sectionPos = -1;//记录数字段数 - 万为一段
	int sectionNumber = 0;
	while (_converNum > 0){
		sectionPos++;
		sectionNumber = _converNum % 10000;

		//保存每个权位和对应的数值
		NumSection numSec;
		numSec.num = sectionNumber;
		numSec.sectionNameStr = QString::fromLocal8Bit(_section[sectionPos]);
		
		_sectionList.push_back(numSec);

		_converNum = _converNum / 10000;
	}

	int numSec = _sectionList.size();
	for (int i = numSec - 1; i >= 0;i--) {
		NumSection numSec = _sectionList.at(i);
		numStr += bitSection(_sectionList.at(i).num,i+1 == _sectionList.size());
		numStr += _sectionList.at(i).sectionNameStr;
	}

	return numStr;
}

QString DigitalToChinese::bitSection(int num, bool bHead) {

	QVector<NumSection>bitList;
	int bitPos = 0;
	int tempNum = num;
	while (num > 0) {
		int bitNum = num % 10;
		NumSection bM;
		bM.num = bitNum;
		bM.sectionNameStr = QString::fromLocal8Bit(_bit[bitPos]);
		bitList.push_back(bM);
		num = num / 10;
		bitPos++;
	}
	QString numStr;

	//1.后面一个或者多个零
	if (tempNum / 1000 > 0 && tempNum % 1000 == 0) {//整千
		return IntelSec(bitList, 1);
	} else if (tempNum / 100 > 0 && tempNum % 100 == 0) {//整百
		if (tempNum/1000 > 0){
			return IntelSec(bitList, 2);
		} else {
			if (!bHead) {//如果是第一段
				numStr += QString::fromLocal8Bit(_chineseNumber[0]);
			}
			return numStr += IntelSec(bitList, 1);
		}
	} else if (tempNum / 10 > 0 && tempNum % 10 == 0) {//整十
		if (tempNum / 1000 > 0) {
			return IntelSec(bitList, 3);
		} else if (tempNum / 100 > 0){
			if (!bHead) {//如果是第一段
				numStr += QString::fromLocal8Bit(_chineseNumber[0]);
			}
			return numStr += IntelSec(bitList, 2);
		}else {
			if (!bHead) {//如果是第一段
				numStr += QString::fromLocal8Bit(_chineseNumber[0]);
			}
			return numStr += IntelSec(bitList, 1);
		}
		return IntelSec(bitList, 3);
	}
	int n = bitList.size();

	//2.前面有一个或者多个零
	if ( n < 4){
		if (!bHead){//如果是第一段
			numStr += QString::fromLocal8Bit(_chineseNumber[0]);
		}
		return numStr += IntelSecZero(bitList);
	}

	//3.中间有一个或者多个零
	return IntelSecZero(bitList);
}

QString DigitalToChinese::IntelSec(QVector<NumSection>&sectionList, int readNum) {
	QString numStr;
	int n = sectionList.size();
	for (int i = n - 1; i >= n - readNum; i--) {
		NumSection bM = sectionList.at(i);
		numStr += QString::fromLocal8Bit(_chineseNumber[bM.num]);
		numStr += bM.sectionNameStr;
	}
	return numStr;
}

QString DigitalToChinese::IntelSecZero(QVector<NumSection>&sectionList) {
	QString numStr;
	int n = sectionList.size();
	for (int i = n - 1; i >= 0; i--) {
		NumSection bM = sectionList.at(i);
		if (bM.num == 0 && sectionList.at(i + 1).num != 0){
			numStr += QString::fromLocal8Bit(_chineseNumber[0]);
			continue;
		} else if(bM.num == 0 && sectionList.at(i+1).num == 0){
			numStr += QString::fromLocal8Bit(_chineseNumber[0]);
			i--;
			continue;
		}
		numStr += QString::fromLocal8Bit(_chineseNumber[bM.num]);
		numStr += bM.sectionNameStr;
	}
	return numStr;
}

使用:

int main(int argc, char *argv[]) {
	DigitalToChinese dtc;
	QString strNum = dtc.digitalToChinese(1230950043);
	
	return 0;
}

在这里插入图片描述
aaa

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值