正整数转成汉字读音(QT)

#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();}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值