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;
}