diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/corelib/text/qstring.cpp | 47 |
1 files changed, 33 insertions, 14 deletions
diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp index 6674d7a0268..ddb12effd07 100644 --- a/src/corelib/text/qstring.cpp +++ b/src/corelib/text/qstring.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2020 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Copyright (C) 2020 Intel Corporation. ** Copyright (C) 2019 Mail.ru Group. ** Contact: https://www.qt.io/licensing/ @@ -8050,22 +8050,28 @@ QString QString::arg(qlonglong a, int fieldWidth, int base, QChar fillChar) cons } unsigned flags = QLocaleData::NoFlags; + // ZeroPadded sorts out left-padding when the fill is zero, to the right of sign: if (fillChar == QLatin1Char('0')) flags = QLocaleData::ZeroPadded; QString arg; - if (d.occurrences > d.locale_occurrences) + if (d.occurrences > d.locale_occurrences) { arg = QLocaleData::c()->longLongToString(a, -1, base, fieldWidth, flags); + Q_ASSERT(fillChar != QLatin1Char('0') || !qIsFinite(a) + || fieldWidth <= arg.length()); + } - QString locale_arg; + QString localeArg; if (d.locale_occurrences > 0) { QLocale locale; if (!(locale.numberOptions() & QLocale::OmitGroupSeparator)) flags |= QLocaleData::GroupDigits; - locale_arg = locale.d->m_data->longLongToString(a, -1, base, fieldWidth, flags); + localeArg = locale.d->m_data->longLongToString(a, -1, base, fieldWidth, flags); + Q_ASSERT(fillChar != QLatin1Char('0') || !qIsFinite(a) + || fieldWidth <= localeArg.length()); } - return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg, fillChar); + return replaceArgEscapes(*this, d, fieldWidth, arg, localeArg, fillChar); } /*! @@ -8092,22 +8098,28 @@ QString QString::arg(qulonglong a, int fieldWidth, int base, QChar fillChar) con } unsigned flags = QLocaleData::NoFlags; + // ZeroPadded sorts out left-padding when the fill is zero, to the right of sign: if (fillChar == QLatin1Char('0')) flags = QLocaleData::ZeroPadded; QString arg; - if (d.occurrences > d.locale_occurrences) + if (d.occurrences > d.locale_occurrences) { arg = QLocaleData::c()->unsLongLongToString(a, -1, base, fieldWidth, flags); + Q_ASSERT(fillChar != QLatin1Char('0') || !qIsFinite(a) + || fieldWidth <= arg.length()); + } - QString locale_arg; + QString localeArg; if (d.locale_occurrences > 0) { QLocale locale; if (!(locale.numberOptions() & QLocale::OmitGroupSeparator)) flags |= QLocaleData::GroupDigits; - locale_arg = locale.d->m_data->unsLongLongToString(a, -1, base, fieldWidth, flags); + localeArg = locale.d->m_data->unsLongLongToString(a, -1, base, fieldWidth, flags); + Q_ASSERT(fillChar != QLatin1Char('0') || !qIsFinite(a) + || fieldWidth <= localeArg.length()); } - return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg, fillChar); + return replaceArgEscapes(*this, d, fieldWidth, arg, localeArg, fillChar); } /*! @@ -8186,6 +8198,7 @@ QString QString::arg(double a, int fieldWidth, char format, int precision, QChar } unsigned flags = QLocaleData::NoFlags; + // ZeroPadded sorts out left-padding when the fill is zero, to the right of sign: if (fillChar == QLatin1Char('0')) flags |= QLocaleData::ZeroPadded; @@ -8211,10 +8224,14 @@ QString QString::arg(double a, int fieldWidth, char format, int precision, QChar } QString arg; - if (d.occurrences > d.locale_occurrences) - arg = QLocaleData::c()->doubleToString(a, precision, form, fieldWidth, flags | QLocaleData::ZeroPadExponent); + if (d.occurrences > d.locale_occurrences) { + arg = QLocaleData::c()->doubleToString(a, precision, form, fieldWidth, + flags | QLocaleData::ZeroPadExponent); + Q_ASSERT(fillChar != QLatin1Char('0') || !qIsFinite(a) + || fieldWidth <= arg.length()); + } - QString locale_arg; + QString localeArg; if (d.locale_occurrences > 0) { QLocale locale; @@ -8225,10 +8242,12 @@ QString QString::arg(double a, int fieldWidth, char format, int precision, QChar flags |= QLocaleData::ZeroPadExponent; if (numberOptions & QLocale::IncludeTrailingZeroesAfterDot) flags |= QLocaleData::AddTrailingZeroes; - locale_arg = locale.d->m_data->doubleToString(a, precision, form, fieldWidth, flags); + localeArg = locale.d->m_data->doubleToString(a, precision, form, fieldWidth, flags); + Q_ASSERT(fillChar != QLatin1Char('0') || !qIsFinite(a) + || fieldWidth <= localeArg.length()); } - return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg, fillChar); + return replaceArgEscapes(*this, d, fieldWidth, arg, localeArg, fillChar); } static inline char16_t to_unicode(const QChar c) { return c.unicode(); } |
