From 872f0b94ac7a863c59bf1175b94cca3b3636cf13 Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Wed, 30 May 2012 16:56:20 +0200 Subject: [PATCH] Make QString("inf").toFloat() return inf instead of zero. Currently, QString::toFloat() returns 0 (and sets ok to false) if you try to convert "inf". This is because inf is greater than QT_MAX_FLOAT and there is currently no check to handle inf. Task-number: QTBUG-8629 Change-Id: I498daf4a7a6f880f928461fca628fcaf7d1d6d08 Reviewed-by: Thiago Macieira Reviewed-by: Giuseppe D'Angelo --- src/corelib/tools/qstring.cpp | 12 ++++++++++-- tests/auto/corelib/tools/qstring/tst_qstring.cpp | 15 +++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index a5a7bad..a2d91c5 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -48,6 +48,7 @@ #endif #include #include "qsimd_p.h" +#include #include #include #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 a3c418c..8d96861 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() -- 2.7.4