summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMårten Nordheim <marten.nordheim@qt.io>2021-07-29 17:58:06 +0200
committerMårten Nordheim <marten.nordheim@qt.io>2021-08-17 00:31:26 +0200
commitde9c03dc6eff8fd54c95d1aa533eabecaad20417 (patch)
tree189cde7a83f0b2f940299cd05cdc278e6cf6a609
parente5e8e4f59ba4c3d59303220a57677360992eb553 (diff)
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 <edward.welbourne@qt.io>
-rw-r--r--src/corelib/text/qbytearray.cpp9
-rw-r--r--src/corelib/text/qlocale_tools.cpp6
-rw-r--r--src/corelib/text/qlocale_tools_p.h1
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 <typename T>
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<QString>(d, form, precision, uppercase);
}
+QByteArray qdtoAscii(double d, QLocaleData::DoubleForm form, int precision, bool uppercase)
+{
+ return dtoString<QByteArray>(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)
{