一、QString转Double的基础方法
QString提供了toDouble()函数,用于将字符串转为double类型:
QString str = "3.14";
double num = str.toDouble();
其中,str为要转换的字符串,num为转换后的double类型数字。toDouble()函数还支持一些参数,例如:
- bool *ok = 0:指向一个布尔型指针,用于指示转换是否成功。如果转换失败,该指针的值将被设置为false。
- int dec = -1:指定小数点的位置。默认值为-1,表示自动检测小数点位置。
如果只是简单的将字符串转为double,那么以上代码就足够了。
二、QString转Double的进阶方法
1. 字符串格式化
如果要将字符串转为double,需要注意字符串的格式。如果格式不正确,toDouble()函数将返回0。(当然,可以使用以上提到的bool *ok参数判断是否转换成功)所以,需要对要转换的字符串进行格式化。
例如,如果一个字符串包含了非数字字符,toDouble()函数将返回0:
QString str1 = "3.14abc";
double num1 = str1.toDouble(); // 返回0
为了让toDouble()函数正确地将字符串转换为double类型,需要考虑以下因素:
- 小数点和千位分隔符:Qt默认使用“.”作为小数点。如果要使用其他小数点符号,可以在toDouble()函数中使用setLocale()函数进行设置。例如:
QString str2 = "1,000.25";
QLocale locale(QLocale::English);
double num2 = locale.toDouble(str2); // num2为1000.25
- 科学计数法:如果字符串中包含科学计数法,需要使用指数符号“E”或“e”,并指定指数的值。例如:
QString str3 = "1.23E-4";
double num3 = str3.toDouble(); // num3为0.000123
2. 数字范围
double类型的范围在计算机中是有限的。如果要转换的字符串超出了double类型的范围,toDouble()函数将返回特殊值“inf”(表示正无穷)或“-inf”(表示负无穷),而不是正确的数字。
为了避免这种情况,可以使用QRegularExpression对要转换的字符串进行正则匹配,确保其不超出double类型的范围:
QString str4 = "1.7e+308";
QRegularExpression reg("(-?\\d*\\.?\\d+)[Ee]([-+]?\\d+)");
QRegularExpressionMatch match = reg.match(str4);
if (match.hasMatch())
{
double num4 = match.captured(1).toDouble() * pow(10, match.captured(2).toInt());
qDebug() << num4; // 输出1.7e+308
}
3. 字符编码
如果要将字符串转换为double,需要确保字符串的编码方式是正确的。如果字符串的编码格式与当前系统的编码方式不兼容,可能会导致转换失败。如果字符串包含Unicode字符,也需要考虑字符编码。
在Qt中,可以使用QTextCodec类将QString转换为QByteArray,然后再将QByteArray转换为double。以下示例展示了使用UTF-8编码的方式进行转换:
QString str5 = "3.14";
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QByteArray arr = codec->fromUnicode(str5);
double num5 = arr.toDouble();
三、QString转Double的常见错误
在实际开发中,可能会遇到以下常见错误:
1. 字符串为空
QString str6 = "";
double num6 = str6.toDouble(); // 返回0
如果字符串为空,toDouble()函数将返回0。
2. 字符串不能转为数字
QString str7 = "abc";
double num7 = str7.toDouble(); // 返回0
如果字符串不能转为数字,toDouble()函数将返回0。
3. 字符串超出double类型的范围
QString str8 = "1.7e+309";
double num8 = str8.toDouble(); // 返回inf
如果字符串超出了double类型的范围,toDouble()函数将返回inf或-inf。
四、示例代码
以下代码演示了如何使用Qt中的QString转Double功能:
#include <QtCore>
#include <QtGui>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 基础方法
QString str1 = "3.14";
double num1 = str1.toDouble();
// 进阶方法
// 字符串格式化
QString str2 = "1,000.25";
QLocale locale(QLocale::English);
double num2 = locale.toDouble(str2);
// 科学计数法
QString str3 = "1.23E-4";
double num3 = str3.toDouble();
// 数字范围
QString str4 = "1.7e+308";
QRegularExpression reg("(-?\\d*\\.?\\d+)[Ee]([-+]?\\d+)");
QRegularExpressionMatch match = reg.match(str4);
if (match.hasMatch())
{
double num4 = match.captured(1).toDouble() * pow(10, match.captured(2).toInt());
qDebug() << num4; // 输出1.7e+308
}
// 字符编码
QString str5 = "3.14";
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QByteArray arr = codec->fromUnicode(str5);
double num5 = arr.toDouble();
// 错误处理
QString str6 = "";
double num6 = str6.toDouble(); // 返回0
QString str7 = "abc";
double num7 = str7.toDouble(); // 返回0
QString str8 = "1.7e+309";
double num8 = str8.toDouble(); // 返回inf
return app.exec();
}