数字转化成大写汉字有着很广泛的应用,比如银行系统,比如语音导航系统等。
处理数字转换成汉字的过程中,主要是完成权值和数字的转换,在我国使用的权值一般是按照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>§ionList, int readNum);
QString IntelSecZero(QVector<NumSection>§ionList);
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>§ionList, 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>§ionList) {
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