diff --git a/src/corelib/serialization/qtextstream.cpp b/src/corelib/serialization/qtextstream.cpp index 2b6aed5d21c..372091a9d7f 100644 --- a/src/corelib/serialization/qtextstream.cpp +++ b/src/corelib/serialization/qtextstream.cpp @@ -2204,44 +2204,34 @@ QTextStream &QTextStream::operator>>(char *c) */ void QTextStreamPrivate::putNumber(qulonglong number, bool negative) { - QString result; - unsigned flags = 0; const QTextStream::NumberFlags numberFlags = params.numberFlags; if (numberFlags & QTextStream::ShowBase) flags |= QLocaleData::ShowBase; - if (numberFlags & QTextStream::ForceSign) + // ForceSign is irrelevant when we'll be including a sign in any case: + if ((numberFlags & QTextStream::ForceSign) && !negative) flags |= QLocaleData::AlwaysShowSign; if (numberFlags & QTextStream::UppercaseBase) flags |= QLocaleData::UppercaseBase; if (numberFlags & QTextStream::UppercaseDigits) flags |= QLocaleData::CapitalEorX; - // add thousands group separators. For backward compatibility we - // don't add a group separator for C locale. + // Group digits. For backward compatibility, we skip this for the C locale. if (locale != QLocale::c() && !locale.numberOptions().testFlag(QLocale::OmitGroupSeparator)) flags |= QLocaleData::GroupDigits; const QLocaleData *dd = locale.d->m_data; int base = params.integerBase ? params.integerBase : 10; - if (negative && base == 10) { - result = dd->longLongToString(-static_cast(number), -1, - base, -1, flags); - } else if (negative) { - // Workaround for backward compatibility for writing negative - // numbers in octal and hex: - // QTextStream(result) << Qt::showbase << Qt::hex << -1 << oct << -1 - // should output: -0x1 -0b1 - result = dd->unsLongLongToString(number, -1, base, -1, flags); + QString result = dd->unsLongLongToString(number, -1, base, -1, flags); + if (negative) { result.prepend(locale.negativeSign()); - } else { - result = dd->unsLongLongToString(number, -1, base, -1, flags); - // workaround for backward compatibility - in octal form with - // ShowBase flag set zero should be written as '00' - if (number == 0 && base == 8 && params.numberFlags & QTextStream::ShowBase - && result == "0"_L1) { - result.prepend(u'0'); - } + } else if (number == 0 && base == 8 && params.numberFlags & QTextStream::ShowBase + && result == "0"_L1) { + // Workaround for backward compatibility - in octal form with ShowBase + // flag set, zero should get its 0 prefix before its 0 value, but + // QLocalePrivate only adds the prefix if the number doesn't start with + // a zero. + result.prepend(u'0'); } putString(result, true); } diff --git a/tests/auto/corelib/serialization/qtextstream/tst_qtextstream.cpp b/tests/auto/corelib/serialization/qtextstream/tst_qtextstream.cpp index d66cc21e318..37aeb3f1d47 100644 --- a/tests/auto/corelib/serialization/qtextstream/tst_qtextstream.cpp +++ b/tests/auto/corelib/serialization/qtextstream/tst_qtextstream.cpp @@ -1123,6 +1123,7 @@ void tst_QTextStream::octTest_data() QTest::addColumn("data"); QTest::newRow("0") << 0 << QByteArray("00"); + QTest::newRow("40") << 40 << QByteArray("050"); } // ------------------------------------------------------------------------------ @@ -2716,7 +2717,6 @@ void tst_QTextStream::manipulators() stream << textData; stream.flush(); - QEXPECT_FAIL("hex-negative", "Discovered while fixing QTBUG-133269", Continue); QCOMPARE(buffer.data(), result); }