QString的两个字符串相加

QString 的数一旦,长度太长,转成toDouble, toLongLong,都不够用时,用字符串相加
目前不支持负数


//检查是否只有数字和最多一个小数点
bool isNumberStr(QString str)
{
    int decimalCount = 0 ; //小数点个数
    for(QChar & c: str)
    {
        if(c == '.')
        {
            decimalCount++;
            if(decimalCount > 1)
                return false;
        }
        else if(! c.isNumber())
        {
            return false;
        }
    }
    return true;
}

//获取小数点后面的位数
int getDecimalCount(QString str)
{
    int decimalCount = 0 ; //小数点个数
    bool isDecimal = str.contains('.'); //是否有小数位
    if(isDecimal)
    {
        isDecimal = false;  //是否找到小数点
        for(QChar & c: str)
        {
            if(c == '.')
            {
                isDecimal = true; //找到小数点,后面的都算了
                continue;
            }

            if(isDecimal)
            {
                decimalCount++;
            }
        }
    }
    return decimalCount;
}

//放大倍数,去掉小数点
void enlargeNum(QString &num,int enlargeCount,int decimalCount)
{
    if(enlargeCount > 0)
    {
        num.remove('.'); //去掉小数点
        if(decimalCount < enlargeCount)
        {
            for(int i = 0; i < enlargeCount - decimalCount; i++)
            {
                num += '0';
            }
        }
    }
}

//缩小倍数,加上小数点
void narrowNum(QString &num,int enlargeCount)
{
    if(enlargeCount > 0)
    {
        int len = num.length();
        while (num.length() <= enlargeCount)
        {
            num.insert(0,"0");
            len = num.length();
        }
        int index = len-enlargeCount;
        num.insert(index, ".");
    }
}

//两个字符串相加,不支持负数
QString addNumberStr(QString num1,QString num2)
{
    QString str;
    if( ! isNumberStr(num1) || ! isNumberStr(num2))
        return "0";

    int decimalCount1 = getDecimalCount(num1) ; //小数点个数
    int decimalCount2 = getDecimalCount(num2) ; //小数点个数
    int enlargeCount = decimalCount1 >decimalCount2 ? decimalCount1 :decimalCount2; //最大位数
    enlargeNum(num1, enlargeCount, decimalCount1);
    enlargeNum(num2, enlargeCount, decimalCount2);

    int isEnter = 0; //是否进1
    int len1 = num1.length();
    int len2 = num2.length();
    int len = len1 > len2 ? len1 : len2;

    //从最后一位位相加
    for(int i = 0; i < len; i++)
    {
        bool isC1 = i < len1; //是否有第1个数的
        bool isC2 = i < len2; //是否有第2个数的
        if(isC1 && isC2) //两个数都有
        {
            int c1 = num1.mid(len1 - 1 - i, 1).toUInt(); //
            int c2 = num2.mid(len2 - 1 - i, 1).toUInt(); //
            int c = c1 + c2 + isEnter;
            if( c >= 10 )
            {//进1 减去10
                isEnter = 1;
                c -= 10;
            }
            else
            {
                isEnter = 0;
            }
            str.insert(0,QString::number(c));
        }
        else if(isC1 && !isC2) //只有一个数有
        {
            int c1 = num1.mid(len1 - 1 - i, 1).toUInt(); //
            int c = c1 + isEnter;
            if( c >= 10 )
            {//进1 减去10
                isEnter = 1;
                c -= 10;
            }
            else
            {
                isEnter = 0;
            }
            str.insert(0,QString::number(c));
        }
        else if(!isC1 && isC2) //只有一个数有
        {
            int c2 = num2.mid(len2 - 1 - i, 1).toUInt(); //
            int c = c2 + isEnter;
            if( c >= 10 )
            {//进1 减去10
                isEnter = 1;
                c -= 10;
            }
            else
            {
                isEnter = 0;
            }
            str.insert(0,QString::number(c));
        }
        else
        {
            break;//两个数都没有了
        }
    }
    if(isEnter)//最后进1
    {
        str.insert(0,"1");
    }
    narrowNum(str, enlargeCount);
    return str;
}

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值