diff options
-rw-r--r-- | src/corelib/text/qbytearray.cpp | 60 | ||||
-rw-r--r-- | src/corelib/text/qlocale_tools.cpp | 40 | ||||
-rw-r--r-- | src/corelib/text/qstring.cpp | 77 | ||||
-rw-r--r-- | tests/auto/corelib/text/qstringapisymmetry/tst_qstringapisymmetry.cpp | 5 |
4 files changed, 121 insertions, 61 deletions
diff --git a/src/corelib/text/qbytearray.cpp b/src/corelib/text/qbytearray.cpp index 9ec5870ea1..46bbd2b2a5 100644 --- a/src/corelib/text/qbytearray.cpp +++ b/src/corelib/text/qbytearray.cpp @@ -3564,8 +3564,9 @@ auto QtPrivate::toUnsignedInteger(QByteArrayView data, int base) -> ParsedNumber If \a base is 0, the base is determined automatically using the following rules: If the byte array begins with "0x", it is assumed to be hexadecimal - (base 16); otherwise, if it begins with "0", it is assumed to be octal (base - 8); otherwise it is assumed to be decimal. + (base 16); otherwise, if it begins with "0b", it is assumed to be binary + (base 2); otherwise, if it begins with "0", it is assumed to be octal + (base 8); otherwise it is assumed to be decimal. Returns 0 if the conversion fails. @@ -3576,6 +3577,8 @@ auto QtPrivate::toUnsignedInteger(QByteArrayView data, int base) -> ParsedNumber regardless of the user's locale. Use QLocale to perform locale-aware conversions between numbers and strings. + \note Support for the "0b" prefix was added in Qt 6.4. + \sa number() */ @@ -3591,8 +3594,9 @@ qlonglong QByteArray::toLongLong(bool *ok, int base) const If \a base is 0, the base is determined automatically using the following rules: If the byte array begins with "0x", it is assumed to be hexadecimal - (base 16); otherwise, if it begins with "0", it is assumed to be octal (base - 8); otherwise it is assumed to be decimal. + (base 16); otherwise, if it begins with "0b", it is assumed to be binary + (base 2); otherwise, if it begins with "0", it is assumed to be octal + (base 8); otherwise it is assumed to be decimal. Returns 0 if the conversion fails. @@ -3603,6 +3607,8 @@ qlonglong QByteArray::toLongLong(bool *ok, int base) const regardless of the user's locale. Use QLocale to perform locale-aware conversions between numbers and strings. + \note Support for the "0b" prefix was added in Qt 6.4. + \sa number() */ @@ -3618,8 +3624,9 @@ qulonglong QByteArray::toULongLong(bool *ok, int base) const If \a base is 0, the base is determined automatically using the following rules: If the byte array begins with "0x", it is assumed to be hexadecimal - (base 16); otherwise, if it begins with "0", it is assumed to be octal (base - 8); otherwise it is assumed to be decimal. + (base 16); otherwise, if it begins with "0b", it is assumed to be binary + (base 2); otherwise, if it begins with "0", it is assumed to be octal + (base 8); otherwise it is assumed to be decimal. Returns 0 if the conversion fails. @@ -3632,6 +3639,8 @@ qulonglong QByteArray::toULongLong(bool *ok, int base) const regardless of the user's locale. Use QLocale to perform locale-aware conversions between numbers and strings. + \note Support for the "0b" prefix was added in Qt 6.4. + \sa number() */ @@ -3647,8 +3656,9 @@ int QByteArray::toInt(bool *ok, int base) const If \a base is 0, the base is determined automatically using the following rules: If the byte array begins with "0x", it is assumed to be hexadecimal - (base 16); otherwise, if it begins with "0", it is assumed to be octal (base - 8); otherwise it is assumed to be decimal. + (base 16); otherwise, if it begins with "0b", it is assumed to be binary + (base 2); otherwise, if it begins with "0", it is assumed to be octal + (base 8); otherwise it is assumed to be decimal. Returns 0 if the conversion fails. @@ -3659,6 +3669,8 @@ int QByteArray::toInt(bool *ok, int base) const regardless of the user's locale. Use QLocale to perform locale-aware conversions between numbers and strings. + \note Support for the "0b" prefix was added in Qt 6.4. + \sa number() */ @@ -3676,8 +3688,9 @@ uint QByteArray::toUInt(bool *ok, int base) const If \a base is 0, the base is determined automatically using the following rules: If the byte array begins with "0x", it is assumed to be hexadecimal - (base 16); otherwise, if it begins with "0", it is assumed to be octal (base - 8); otherwise it is assumed to be decimal. + (base 16); otherwise, if it begins with "0b", it is assumed to be binary + (base 2); otherwise, if it begins with "0", it is assumed to be octal + (base 8); otherwise it is assumed to be decimal. Returns 0 if the conversion fails. @@ -3690,6 +3703,8 @@ uint QByteArray::toUInt(bool *ok, int base) const regardless of the user's locale. Use QLocale to perform locale-aware conversions between numbers and strings. + \note Support for the "0b" prefix was added in Qt 6.4. + \sa number() */ long QByteArray::toLong(bool *ok, int base) const @@ -3706,8 +3721,9 @@ long QByteArray::toLong(bool *ok, int base) const If \a base is 0, the base is determined automatically using the following rules: If the byte array begins with "0x", it is assumed to be hexadecimal - (base 16); otherwise, if it begins with "0", it is assumed to be octal (base - 8); otherwise it is assumed to be decimal. + (base 16); otherwise, if it begins with "0b", it is assumed to be binary + (base 2); otherwise, if it begins with "0", it is assumed to be octal + (base 8); otherwise it is assumed to be decimal. Returns 0 if the conversion fails. @@ -3718,6 +3734,8 @@ long QByteArray::toLong(bool *ok, int base) const regardless of the user's locale. Use QLocale to perform locale-aware conversions between numbers and strings. + \note Support for the "0b" prefix was added in Qt 6.4. + \sa number() */ ulong QByteArray::toULong(bool *ok, int base) const @@ -3731,9 +3749,10 @@ ulong QByteArray::toULong(bool *ok, int base) const digits beyond 9; A is ten, B is eleven and so on. If \a base is 0, the base is determined automatically using the following - rules: If the byte array begins with "0x", it is assumed to be hexadecimal; - otherwise, if it begins with "0", it is assumed to be octal; otherwise it is - assumed to be decimal. + rules: If the byte array begins with "0x", it is assumed to be hexadecimal + (base 16); otherwise, if it begins with "0b", it is assumed to be binary + (base 2); otherwise, if it begins with "0", it is assumed to be octal + (base 8); otherwise it is assumed to be decimal. Returns 0 if the conversion fails. @@ -3744,6 +3763,8 @@ ulong QByteArray::toULong(bool *ok, int base) const regardless of the user's locale. Use QLocale to perform locale-aware conversions between numbers and strings. + \note Support for the "0b" prefix was added in Qt 6.4. + \sa number() */ @@ -3758,9 +3779,10 @@ short QByteArray::toShort(bool *ok, int base) const letters for digits beyond 9; A is ten, B is eleven and so on. If \a base is 0, the base is determined automatically using the following - rules: If the byte array begins with "0x", it is assumed to be hexadecimal; - otherwise, if it begins with "0", it is assumed to be octal; otherwise it is - assumed to be decimal. + rules: If the byte array begins with "0x", it is assumed to be hexadecimal + (base 16); otherwise, if it begins with "0b", it is assumed to be binary + (base 2); otherwise, if it begins with "0", it is assumed to be octal + (base 8); otherwise it is assumed to be decimal. Returns 0 if the conversion fails. @@ -3771,6 +3793,8 @@ short QByteArray::toShort(bool *ok, int base) const regardless of the user's locale. Use QLocale to perform locale-aware conversions between numbers and strings. + \note Support for the "0b" prefix was added in Qt 6.4. + \sa number() */ diff --git a/src/corelib/text/qlocale_tools.cpp b/src/corelib/text/qlocale_tools.cpp index 8259878448..7a2cce6f2c 100644 --- a/src/corelib/text/qlocale_tools.cpp +++ b/src/corelib/text/qlocale_tools.cpp @@ -401,30 +401,42 @@ double qt_asciiToDouble(const char *num, qsizetype numLen, bool &ok, int &proces return d; } -/* Detect base if 0 and, if base is hex, skip over 0x prefix */ +/* Detect base if 0 and, if base is hex or bin, skip over 0x/0b prefixes */ static auto scanPrefix(const char *p, const char *stop, int base) { + struct R + { + const char *next; + int base; + }; if (p < stop && *p >= '0' && *p <= '9') { if (*p == '0') { - const char *x = p + 1; - if (x < stop && (*x == 'x' || *x == 'X')) { - if (base == 0) - base = 16; - if (base == 16) - p += 2; - } else if (base == 0) { - base = 8; + const char *x_or_b = p + 1; + if (x_or_b < stop) { + switch (*x_or_b) { + case 'b': + case 'B': + if (base == 0) + base = 2; + if (base == 2) + p += 2; + return R{p, base}; + case 'x': + case 'X': + if (base == 0) + base = 16; + if (base == 16) + p += 2; + return R{p, base}; + } } + if (base == 0) + base = 8; } else if (base == 0) { base = 10; } Q_ASSERT(base); } - struct R - { - const char *next; - int base; - }; return R{p, base}; } diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp index a350401b30..00f899ee99 100644 --- a/src/corelib/text/qstring.cpp +++ b/src/corelib/text/qstring.cpp @@ -7111,9 +7111,10 @@ QString QString::vasprintf(const char *cformat, va_list ap) If \a ok is not \nullptr, failure is reported by setting *\a{ok} to \c false, and success by setting *\a{ok} to \c true. - If \a base is 0, the C language convention is used: if the string - begins with "0x", base 16 is used; otherwise, if the string begins with "0", - base 8 is used; otherwise, base 10 is used. + If \a base is 0, the C language convention is used: if the string begins + with "0x", base 16 is used; otherwise, if the string begins with "0b", base + 2 is used; otherwise, if the string begins with "0", base 8 is used; + otherwise, base 10 is used. The string conversion will always happen in the 'C' locale. For locale-dependent conversion use QLocale::toLongLong() @@ -7124,6 +7125,8 @@ QString QString::vasprintf(const char *cformat, va_list ap) This function ignores leading and trailing whitespace. + \note Support for the "0b" prefix was added in Qt 6.4. + \sa number(), toULongLong(), toInt(), QLocale::toLongLong() */ @@ -7153,9 +7156,10 @@ qlonglong QString::toIntegral_helper(QStringView string, bool *ok, int base) If \a ok is not \nullptr, failure is reported by setting *\a{ok} to \c false, and success by setting *\a{ok} to \c true. - If \a base is 0, the C language convention is used: if the string - begins with "0x", base 16 is used; otherwise, if the string begins with "0", - base 8 is used; otherwise, base 10 is used. + If \a base is 0, the C language convention is used: if the string begins + with "0x", base 16 is used; otherwise, if the string begins with "0b", base + 2 is used; otherwise, if the string begins with "0", base 8 is used; + otherwise, base 10 is used. The string conversion will always happen in the 'C' locale. For locale-dependent conversion use QLocale::toULongLong() @@ -7166,6 +7170,8 @@ qlonglong QString::toIntegral_helper(QStringView string, bool *ok, int base) This function ignores leading and trailing whitespace. + \note Support for the "0b" prefix was added in Qt 6.4. + \sa number(), toLongLong(), QLocale::toULongLong() */ @@ -7196,9 +7202,10 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base) If \a ok is not \nullptr, failure is reported by setting *\a{ok} to \c false, and success by setting *\a{ok} to \c true. - If \a base is 0, the C language convention is used: if the string - begins with "0x", base 16 is used; otherwise, if the string begins with "0", - base 8 is used; otherwise, base 10 is used. + If \a base is 0, the C language convention is used: if the string begins + with "0x", base 16 is used; otherwise, if the string begins with "0b", base + 2 is used; otherwise, if the string begins with "0", base 8 is used; + otherwise, base 10 is used. The string conversion will always happen in the 'C' locale. For locale-dependent conversion use QLocale::toLongLong() @@ -7209,6 +7216,8 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base) This function ignores leading and trailing whitespace. + \note Support for the "0b" prefix was added in Qt 6.4. + \sa number(), toULong(), toInt(), QLocale::toInt() */ @@ -7222,9 +7231,10 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base) If \a ok is not \nullptr, failure is reported by setting *\a{ok} to \c false, and success by setting *\a{ok} to \c true. - If \a base is 0, the C language convention is used: if the string - begins with "0x", base 16 is used; otherwise, if the string begins with "0", - base 8 is used; otherwise, base 10 is used. + If \a base is 0, the C language convention is used: if the string begins + with "0x", base 16 is used; otherwise, if the string begins with "0b", base + 2 is used; otherwise, if the string begins with "0", base 8 is used; + otherwise, base 10 is used. The string conversion will always happen in the 'C' locale. For locale-dependent conversion use QLocale::toULongLong() @@ -7235,6 +7245,8 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base) This function ignores leading and trailing whitespace. + \note Support for the "0b" prefix was added in Qt 6.4. + \sa number(), QLocale::toUInt() */ @@ -7247,9 +7259,10 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base) If \a ok is not \nullptr, failure is reported by setting *\a{ok} to \c false, and success by setting *\a{ok} to \c true. - If \a base is 0, the C language convention is used: if the string - begins with "0x", base 16 is used; otherwise, if the string begins with "0", - base 8 is used; otherwise, base 10 is used. + If \a base is 0, the C language convention is used: if the string begins + with "0x", base 16 is used; otherwise, if the string begins with "0b", base + 2 is used; otherwise, if the string begins with "0", base 8 is used; + otherwise, base 10 is used. The string conversion will always happen in the 'C' locale. For locale-dependent conversion use QLocale::toInt() @@ -7260,6 +7273,8 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base) This function ignores leading and trailing whitespace. + \note Support for the "0b" prefix was added in Qt 6.4. + \sa number(), toUInt(), toDouble(), QLocale::toInt() */ @@ -7272,9 +7287,10 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base) If \a ok is not \nullptr, failure is reported by setting *\a{ok} to \c false, and success by setting *\a{ok} to \c true. - If \a base is 0, the C language convention is used: if the string - begins with "0x", base 16 is used; otherwise, if the string begins with "0", - base 8 is used; otherwise, base 10 is used. + If \a base is 0, the C language convention is used: if the string begins + with "0x", base 16 is used; otherwise, if the string begins with "0b", base + 2 is used; otherwise, if the string begins with "0", base 8 is used; + otherwise, base 10 is used. The string conversion will always happen in the 'C' locale. For locale-dependent conversion use QLocale::toUInt() @@ -7285,6 +7301,8 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base) This function ignores leading and trailing whitespace. + \note Support for the "0b" prefix was added in Qt 6.4. + \sa number(), toInt(), QLocale::toUInt() */ @@ -7298,9 +7316,10 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base) If \a ok is not \nullptr, failure is reported by setting *\a{ok} to \c false, and success by setting *\a{ok} to \c true. - If \a base is 0, the C language convention is used: if the string - begins with "0x", base 16 is used; otherwise, if the string begins with "0", - base 8 is used; otherwise, base 10 is used. + If \a base is 0, the C language convention is used: if the string begins + with "0x", base 16 is used; otherwise, if the string begins with "0b", base + 2 is used; otherwise, if the string begins with "0", base 8 is used; + otherwise, base 10 is used. The string conversion will always happen in the 'C' locale. For locale-dependent conversion use QLocale::toShort() @@ -7311,6 +7330,8 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base) This function ignores leading and trailing whitespace. + \note Support for the "0b" prefix was added in Qt 6.4. + \sa number(), toUShort(), toInt(), QLocale::toShort() */ @@ -7324,9 +7345,10 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base) If \a ok is not \nullptr, failure is reported by setting *\a{ok} to \c false, and success by setting *\a{ok} to \c true. - If \a base is 0, the C language convention is used: if the string - begins with "0x", base 16 is used; if the string begins with "0", - base 8 is used; otherwise, base 10 is used. + If \a base is 0, the C language convention is used: if the string begins + with "0x", base 16 is used; otherwise, if the string begins with "0b", base + 2 is used; otherwise, if the string begins with "0", base 8 is used; + otherwise, base 10 is used. The string conversion will always happen in the 'C' locale. For locale-dependent conversion use QLocale::toUShort() @@ -7337,6 +7359,8 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base) This function ignores leading and trailing whitespace. + \note Support for the "0b" prefix was added in Qt 6.4. + \sa number(), toShort(), QLocale::toUShort() */ @@ -10210,7 +10234,8 @@ QString &QString::setRawData(const QChar *unicode, qsizetype size) If \a base is 0, the base is determined automatically using the following rules: if the Latin-1 string begins with "0x", the rest of it is read as - hexadecimal (base 16); otherwise, if it begins with "0", the rest of it is + hexadecimal (base 16); otherwise, if it begins with "0b", the rest of it is + read as binary (base 2); otherwise, if it begins with "0", the rest of it is read as octal (base 8); otherwise it is read as decimal. Returns 0 if the conversion fails. @@ -10225,6 +10250,8 @@ QString &QString::setRawData(const QChar *unicode, qsizetype size) This function ignores leading and trailing spacing characters. //! [latin1-numeric-conversion-note] + + \note Support for the "0b" prefix was added in Qt 6.4. */ /*! diff --git a/tests/auto/corelib/text/qstringapisymmetry/tst_qstringapisymmetry.cpp b/tests/auto/corelib/text/qstringapisymmetry/tst_qstringapisymmetry.cpp index c92cb0ad92..6a8f62d4b7 100644 --- a/tests/auto/corelib/text/qstringapisymmetry/tst_qstringapisymmetry.cpp +++ b/tests/auto/corelib/text/qstringapisymmetry/tst_qstringapisymmetry.cpp @@ -2654,14 +2654,13 @@ void tst_QStringApiSymmetry::toNumberWithBases_data() const char prefix[3]; int base; } bases[] = { - { "", 2 }, // should be {"0b", 2}, but Qt lacks support for the 0b prefix (QTBUG-85002) + { "0b", 2 }, { "0", 8 }, { "", 10 }, { "0x", 16 }, }; const auto check = [&](const char *input, qint64 n2, qint64 n8, qint64 n10, qint64 n16, bool result) { - for (const auto &e : bases) { const QString data = QLatin1StringView(e.prefix) + QString::fromUtf8(input); const auto row = [&](int base) { @@ -2678,8 +2677,6 @@ void tst_QStringApiSymmetry::toNumberWithBases_data() << data << base << select(e.base /* NOT base! */) << result; }; row(e.base); // explicit base - if (e.base == 2) - continue; // Qt doesn't know 0b (yet, QTBUG-85002), so nothing to auto-detect row(0); // automatically detected base } }; |