From de9c03dc6eff8fd54c95d1aa533eabecaad20417 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Nordheim?= Date: Thu, 29 Jul 2021 17:58:06 +0200 Subject: [PATCH] QByteArray: Disentangle number(double) from QLocale Previously number(double) would go through QLocale which takes a lot of factors into consideration (which we don't need in this case) and outputs a QString in the end, which we then have to convert back to QByteArray. Avoid all that extra work and format it directly into a QByteArray. The other number() functions do not use QLocale, so are left alone for now. Task-number: QTBUG-88484 Change-Id: I4c2eaf101a55ba16e858f95017fb171589a0184e Reviewed-by: Edward Welbourne --- src/corelib/text/qbytearray.cpp | 9 ++------- src/corelib/text/qlocale_tools.cpp | 6 ++++++ src/corelib/text/qlocale_tools_p.h | 1 + 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/corelib/text/qbytearray.cpp b/src/corelib/text/qbytearray.cpp index 23db7db3e2..d1efd2c35a 100644 --- a/src/corelib/text/qbytearray.cpp +++ b/src/corelib/text/qbytearray.cpp @@ -4110,13 +4110,8 @@ QByteArray QByteArray::number(qulonglong n, int base) QByteArray QByteArray::number(double n, char format, int precision) { QLocaleData::DoubleForm form = QLocaleData::DFDecimal; - uint flags = QLocaleData::ZeroPadExponent; - char lower = asciiLower(uchar(format)); - if (format != lower) - flags |= QLocaleData::CapitalEorX; - - switch (lower) { + switch (asciiLower(format)) { case 'f': form = QLocaleData::DFDecimal; break; @@ -4133,7 +4128,7 @@ QByteArray QByteArray::number(double n, char format, int precision) break; } - return QLocaleData::c()->doubleToString(n, precision, form, -1, flags).toUtf8(); + return qdtoAscii(n, form, precision, isUpperCaseAscii(format)); } /*! diff --git a/src/corelib/text/qlocale_tools.cpp b/src/corelib/text/qlocale_tools.cpp index dc0460fa4e..15933c3644 100644 --- a/src/corelib/text/qlocale_tools.cpp +++ b/src/corelib/text/qlocale_tools.cpp @@ -628,6 +628,7 @@ static constexpr int digits(int number) return i; } +// Used generically for both QString and QByteArray template static T dtoString(double d, QLocaleData::DoubleForm form, int precision, bool uppercase) { @@ -783,4 +784,9 @@ QString qdtoBasicLatin(double d, QLocaleData::DoubleForm form, int precision, bo return dtoString(d, form, precision, uppercase); } +QByteArray qdtoAscii(double d, QLocaleData::DoubleForm form, int precision, bool uppercase) +{ + return dtoString(d, form, precision, uppercase); +} + QT_END_NAMESPACE diff --git a/src/corelib/text/qlocale_tools_p.h b/src/corelib/text/qlocale_tools_p.h index 8648775e35..b6ffff8224 100644 --- a/src/corelib/text/qlocale_tools_p.h +++ b/src/corelib/text/qlocale_tools_p.h @@ -72,6 +72,7 @@ QString qulltoBasicLatin(qulonglong l, int base, bool negative); QString qulltoa(qulonglong l, int base, const QStringView zero); Q_CORE_EXPORT QString qdtoa(qreal d, int *decpt, int *sign); QString qdtoBasicLatin(double d, QLocaleData::DoubleForm form, int precision, bool uppercase); +QByteArray qdtoAscii(double d, QLocaleData::DoubleForm form, int precision, bool uppercase); inline bool isZero(double d) {