#include <QCoreApplication>
#include <QDebug>
#include <QString>
QString num2Voice(int num)
{
QString src = QString("%1").arg(num);
if (src.at(0) == "-")
{
qDebug()<<"input num too big or less than 0";
return "";
}
QString slist(QStringLiteral("十百千"));
QString blist(QStringLiteral("万亿"));
QString number(QStringLiteral("零一二三四五六七八九"));
QString dest=""; //数字的读法
if (src.length() == 1) //只有一位直接读
{
dest = QString("%1").arg(number.at(num)) + dest;
return dest;
}
for (int i=0; i<src.length(); ++i)
{
int tempIndex = i%4; //万亿相隔四位,四位一个循环
int curReadNum = num % 10; //当前读取的数字
if (tempIndex!=0)
{
if (curReadNum != 0) //当前数字不是0,则读入数字加上后面的单位
{
dest = QString("%1%2").arg(number.at(curReadNum)).arg(slist.at(tempIndex-1)) + dest;
}
else //当前读入的是0
{
//将0读成“零”,排除连续两个“零”的读法,连续两个零读成一个,排除“零万”、“零亿”的读法
if ((dest.length() != 0) &&
dest.at(0) != number.at(0) &&
dest.at(0) != blist.at(0) &&
dest.at(0) != blist.at(1))
{
dest = QString("%1").arg(number.at(curReadNum)) + dest;
}
}
}
else //当前读的数是个位,或者万位,或者亿位
{
if (i == 0) //读个位
{
if (curReadNum != 0) //个位如果是0,不需要读,不是0才需要读
{
dest = QString("%1").arg(number.at(curReadNum)) + dest;
}
}
else
{
if (dest.length()!=0 )
{
//排除单位前没有数字的情况,如当前只有一个“万”,读入亿位时就不需要这个“万”了,否则“一亿”会读成“一亿万”
if(blist.contains(QString("%1").arg(dest.at(0))))
{
dest.remove(0,1);
}
}
if (curReadNum != 0) //当前读入的不是0
{
//增加单位“万”或者“亿”
dest = QString("%1%2").arg(number.at(curReadNum)).arg(blist.at( i/4 - 1)) + dest;
}
else //当前读入的是0,只增加单位“万”或“亿”,避免“零万”、“零亿”的读法
{
dest = QString("%1").arg(blist.at( i/4 - 1)) + dest;
}
}
}
num = num / 10;
}
//一十开头时,按照习惯,去掉一。如11读成“十一”而不是“一十一”
if (dest.at(0) == number.at(1) && dest.at(1) == slist.at(0))
{
dest.remove(0,1);
}
return dest;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); qDebug()<<num2Voice(123456);
return a.exec();}
正整数转成汉字读音(QT)
最新推荐文章于 2021-07-02 14:36:18 发布