之前出现过QString.toDouble()非0数据转换成0的情况,具体情况忘记了,所以自己写了个转换。
仅供参考。
1、原理
就是支持科学计算法的double,提取成系数和科学计算的形式,自己计算。
比如123456e20的字符串,提取出来就是1.23456(系数)*10^25;这个25就是提取出来的幂。
double stringToDouble(const QString &value)
{
double factor;
int powint;
if (parseDoubleString(value, factor, powint)) {
return factor * pow(10, powint);
} else {
return 0;
}
}
bool parseDoubleString(const QString &valueStr, double &factor, int &pow)
{
factor = 0;
pow = 0;
double minVal = DOUBLE_MIN;
bool minCanEqual = false;
double maxVal = DOUBLE_MAX;
bool maxCanEqual = false;
bool overtransrange = false;
if (valueStr.contains("e", Qt::CaseInsensitive)) {
QString splitSymbol = "e";
if (valueStr.contains("E", Qt::CaseSensitive)) {
splitSymbol = "E";
}
QStringList valuelist = valueStr.split(splitSymbol);
if (valuelist.size() != 2) {
return false;
}
double tmpFactor;
int tmpPow;
parseDoubleString(valuelist[0], tmpFactor, tmpPow);
int expint = valuelist[1].toInt();
pow = expint + tmpPow;
factor = tmpFactor;
} else if (valueStr.startsWith("-")) {
QString tmpStr = valueStr;
parseDoubleString(tmpStr.remove(0, 1), factor, pow);
factor = -factor;
} else if (valueStr.contains(".")) {
QStringList valuelist = valueStr.split(".");
if (valuelist.size() != 2) {
return false;
}
QString valueInt = valuelist[0];
QString valueDecimal = valuelist[1];
QString factorStr;
valueInt.remove(QRegExp("^[0]*"));
if (!valueInt.isEmpty()) {
pow = valueInt.length() - 1;
if (valueInt.length() > 1) {
factorStr = valueInt.insert(1, '.') + valueDecimal;
} else {
factorStr = valueInt + '.' + valueDecimal;
}
factor = factorStr.toDouble();
return true;
}
for (int j = 0; j < valueDecimal.length(); ++j) {
if (factorStr.isEmpty() && valueDecimal[j] == '0') {
pow -= 1;
}
if (factorStr.isEmpty() && valueDecimal[j] > '0') {
factorStr = valueDecimal[j];
pow -= 1;
} else if (!factorStr.isEmpty()) {
factorStr += valueDecimal[j];
}
}
if (factorStr.length() > 1) {
factorStr = factorStr.insert(1, '.');
}
factor = factorStr.toDouble();
} else {
QString valueInt = valueStr;
valueInt.remove(QRegExp("^[0]*"));
if (valueInt.length() > 1) {
pow = valueInt.length() - 1;
factor = valueInt.insert(1, '.').toDouble();
} else {
pow = 0;
factor = valueInt.toDouble();
}
}
return true;
}
兴趣的可以优化下。
原创不易,喜欢就点个赞吧