QLocale: Have qstrntod() return end of parsed string also on underflow

Underflows should be treated the same as overflows.

Fixes: QTBUG-108628
Change-Id: I23aa7bbe1d103778cefca08bd3e584e72f306583
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
bb10
Ulf Hermann 2022-11-25 09:22:21 +01:00
parent 95b4cfb1af
commit 6aa02bdeaf
2 changed files with 9 additions and 1 deletions

View File

@ -354,7 +354,7 @@ QSimpleParsedNumber<double> qt_asciiToDouble(const char *num, qsizetype numLen,
for (int i = 0; i < processed; ++i) {
if (num[i] >= '1' && num[i] <= '9') {
// if a digit before any 'e' is not 0, then a non-zero number was intended.
return {};
return {d, -processed};
} else if (num[i] == 'e' || num[i] == 'E') {
break;
}

View File

@ -1250,6 +1250,10 @@ void tst_QLocale::strtod_data()
QTest::newRow("1e2000") << QString("1e2000") << qInf() << 6 << false;
QTest::newRow("-1e2000") << QString("-1e2000") << -qInf() << 7 << false;
// Underflow - fails but reports right length:
QTest::newRow("1e-2000") << QString("1e-2000") << 0.0 << 7 << false;
QTest::newRow("-1e-2000") << QString("-1e-2000") << 0.0 << 8 << false;
// starts with junk, fails
QTest::newRow("a0") << QString("a0") << 0.0 << 0 << false;
QTest::newRow("a0.") << QString("a0.") << 0.0 << 0 << false;
@ -1285,6 +1289,10 @@ void tst_QLocale::strtod_data()
QTest::newRow("1e2000 cruft") << QString("1e2000 cruft") << qInf() << 6 << false;
QTest::newRow("-1e2000 cruft") << QString("-1e2000 cruft") << -qInf() << 7 << false;
// Underflow, ends with cruft - fails but reports right length:
QTest::newRow("1e-2000 cruft") << QString("1e-2000 cruft") << 0.0 << 7 << false;
QTest::newRow("-1e-2000 cruft") << QString("-1e-2000 cruft") << 0.0 << 8 << false;
// "0x" prefix, success but only for the "0" before "x"
QTest::newRow("0x0") << QString("0x0") << 0.0 << 1 << true;
QTest::newRow("0x0.") << QString("0x0.") << 0.0 << 1 << true;