summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/tools/qstring.cpp12
-rw-r--r--tests/auto/corelib/tools/qstring/tst_qstring.cpp15
2 files changed, 25 insertions, 2 deletions
diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp
index a5a7badeac..a2d91c561c 100644
--- a/src/corelib/tools/qstring.cpp
+++ b/src/corelib/tools/qstring.cpp
@@ -48,6 +48,7 @@
#endif
#include <private/qutfcodec_p.h>
#include "qsimd_p.h"
+#include <qnumeric.h>
#include <qdatastream.h>
#include <qlist.h>
#include "qlocale.h"
@@ -6051,14 +6052,21 @@ float QString::toFloat(bool *ok) const
{
bool myOk;
double d = toDouble(&myOk);
- if (!myOk || d > QT_MAX_FLOAT || d < -QT_MAX_FLOAT) {
+ if (!myOk) {
+ if (ok != 0)
+ *ok = false;
+ return 0.0;
+ }
+ if (qIsInf(d))
+ return float(d);
+ if (d > QT_MAX_FLOAT || d < -QT_MAX_FLOAT) {
if (ok != 0)
*ok = false;
return 0.0;
}
if (ok != 0)
*ok = true;
- return (float) d;
+ return float(d);
}
/*! \fn QString &QString::setNum(int n, int base)
diff --git a/tests/auto/corelib/tools/qstring/tst_qstring.cpp b/tests/auto/corelib/tools/qstring/tst_qstring.cpp
index a3c418c1bb..8d96861eb9 100644
--- a/tests/auto/corelib/tools/qstring/tst_qstring.cpp
+++ b/tests/auto/corelib/tools/qstring/tst_qstring.cpp
@@ -4850,6 +4850,21 @@ void tst_QString::nanAndInf()
QString("0INF0").toLong(&ok, 36);
QVERIFY(ok);
+
+ // Check that inf (float) => "inf" (QString) => inf (float).
+ float value = qInf();
+ QString valueAsString = QString::number(value);
+ QCOMPARE(valueAsString, QString::fromLatin1("inf"));
+ float valueFromString = valueAsString.toFloat();
+ QVERIFY(qIsInf(valueFromString));
+
+ // Check that -inf (float) => "-inf" (QString) => -inf (float).
+ value = -qInf();
+ valueAsString = QString::number(value);
+ QCOMPARE(valueAsString, QString::fromLatin1("-inf"));
+ valueFromString = valueAsString.toFloat();
+ QVERIFY(value == -qInf());
+ QVERIFY(qIsInf(valueFromString));
}
void tst_QString::arg_fillChar_data()