QLocale: add toString(Q(Date|QTime)+, QStringView format) overloads
While at it, change the interface of qt_repeatCount() to just take a single QStringView, since QStringView::mid() is so cheap. Add some \internal docs. [ChangeLog][QtCore][QLocale] Added toString(QDate/QTime/QDateTime) overloads taking the format string as a QStringView. Change-Id: Ic078796677a6db06227c8a3e276dbdb1039ceead Reviewed-by: Anton Kudryavtsev <antkudr@mail.ru> Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>bb10
parent
9c243d2637
commit
d68c162c1b
|
|
@ -866,7 +866,7 @@ QString QDate::toString(Qt::DateFormat format) const
|
|||
case Qt::DefaultLocaleLongDate:
|
||||
return QLocale().toString(*this, QLocale::LongFormat);
|
||||
case Qt::RFC2822Date:
|
||||
return QLocale::c().toString(*this, QStringLiteral("dd MMM yyyy"));
|
||||
return QLocale::c().toString(*this, QStringViewLiteral("dd MMM yyyy"));
|
||||
default:
|
||||
#ifndef QT_NO_TEXTDATE
|
||||
case Qt::TextDate:
|
||||
|
|
@ -3795,7 +3795,7 @@ QString QDateTime::toString(Qt::DateFormat format) const
|
|||
case Qt::DefaultLocaleLongDate:
|
||||
return QLocale().toString(*this, QLocale::LongFormat);
|
||||
case Qt::RFC2822Date: {
|
||||
buf = QLocale::c().toString(*this, QStringLiteral("dd MMM yyyy hh:mm:ss "));
|
||||
buf = QLocale::c().toString(*this, QStringViewLiteral("dd MMM yyyy hh:mm:ss "));
|
||||
buf += toOffsetString(Qt::TextDate, offsetFromUtc());
|
||||
return buf;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -518,7 +518,7 @@ static const QLocaleData *findLocaleData(const QString &name)
|
|||
return QLocaleData::findLocaleData(lang, script, cntry);
|
||||
}
|
||||
|
||||
QString qt_readEscapedFormatString(const QString &format, int *idx)
|
||||
QString qt_readEscapedFormatString(QStringView format, int *idx)
|
||||
{
|
||||
int &i = *idx;
|
||||
|
||||
|
|
@ -552,13 +552,31 @@ QString qt_readEscapedFormatString(const QString &format, int *idx)
|
|||
return result;
|
||||
}
|
||||
|
||||
int qt_repeatCount(const QString &s, int i)
|
||||
/*!
|
||||
\internal
|
||||
|
||||
Counts the number of identical leading characters in \a s.
|
||||
|
||||
If \a s is empty, returns 0.
|
||||
|
||||
Otherwise, returns the number of consecutive \c{s.front()}
|
||||
characters at the start of \a s.
|
||||
|
||||
\code
|
||||
qt_repeatCount(u"a"); // == 1
|
||||
qt_repeatCount(u"ab"); // == 1
|
||||
qt_repeatCount(u"aab"); // == 2
|
||||
\endcode
|
||||
*/
|
||||
int qt_repeatCount(QStringView s)
|
||||
{
|
||||
QChar c = s.at(i);
|
||||
int j = i + 1;
|
||||
if (s.isEmpty())
|
||||
return 0;
|
||||
const QChar c = s.front();
|
||||
qssize_t j = 1;
|
||||
while (j < s.size() && s.at(j) == c)
|
||||
++j;
|
||||
return j - i;
|
||||
return int(j);
|
||||
}
|
||||
|
||||
static const QLocaleData *default_data = 0;
|
||||
|
|
@ -1725,6 +1743,7 @@ QString QLocale::toString(qulonglong i) const
|
|||
return d->m_data->unsLongLongToString(i, -1, 10, -1, flags);
|
||||
}
|
||||
|
||||
#if QT_STRINGVIEW_LEVEL < 2
|
||||
/*!
|
||||
Returns a localized string representation of the given \a date in the
|
||||
specified \a format.
|
||||
|
|
@ -1735,6 +1754,19 @@ QString QLocale::toString(const QDate &date, const QString &format) const
|
|||
{
|
||||
return d->dateTimeToString(format, QDateTime(), date, QTime(), this);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*!
|
||||
\since 5.10
|
||||
|
||||
Returns a localized string representation of the given \a date in the
|
||||
specified \a format.
|
||||
If \a format is an empty string, an empty string is returned.
|
||||
*/
|
||||
QString QLocale::toString(const QDate &date, QStringView format) const
|
||||
{
|
||||
return d->dateTimeToString(format, QDateTime(), date, QTime(), this);
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns a localized string representation of the given \a date according
|
||||
|
|
@ -1760,7 +1792,7 @@ QString QLocale::toString(const QDate &date, FormatType format) const
|
|||
return toString(date, format_str);
|
||||
}
|
||||
|
||||
static bool timeFormatContainsAP(const QString &format)
|
||||
static bool timeFormatContainsAP(QStringView format)
|
||||
{
|
||||
int i = 0;
|
||||
while (i < format.size()) {
|
||||
|
|
@ -1777,6 +1809,7 @@ static bool timeFormatContainsAP(const QString &format)
|
|||
return false;
|
||||
}
|
||||
|
||||
#if QT_STRINGVIEW_LEVEL < 2
|
||||
/*!
|
||||
Returns a localized string representation of the given \a time according
|
||||
to the specified \a format.
|
||||
|
|
@ -1786,7 +1819,21 @@ QString QLocale::toString(const QTime &time, const QString &format) const
|
|||
{
|
||||
return d->dateTimeToString(format, QDateTime(), QDate(), time, this);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*!
|
||||
\since 5.10
|
||||
|
||||
Returns a localized string representation of the given \a time according
|
||||
to the specified \a format.
|
||||
If \a format is an empty string, an empty string is returned.
|
||||
*/
|
||||
QString QLocale::toString(const QTime &time, QStringView format) const
|
||||
{
|
||||
return d->dateTimeToString(format, QDateTime(), QDate(), time, this);
|
||||
}
|
||||
|
||||
#if QT_STRINGVIEW_LEVEL < 2
|
||||
/*!
|
||||
\since 4.4
|
||||
|
||||
|
|
@ -1799,6 +1846,19 @@ QString QLocale::toString(const QDateTime &dateTime, const QString &format) cons
|
|||
{
|
||||
return d->dateTimeToString(format, dateTime, QDate(), QTime(), this);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*!
|
||||
\since 5.10
|
||||
|
||||
Returns a localized string representation of the given \a dateTime according
|
||||
to the specified \a format.
|
||||
If \a format is an empty string, an empty string is returned.
|
||||
*/
|
||||
QString QLocale::toString(const QDateTime &dateTime, QStringView format) const
|
||||
{
|
||||
return d->dateTimeToString(format, dateTime, QDate(), QTime(), this);
|
||||
}
|
||||
|
||||
/*!
|
||||
\since 4.4
|
||||
|
|
@ -2710,7 +2770,7 @@ QString QLocale::pmText() const
|
|||
}
|
||||
|
||||
|
||||
QString QLocalePrivate::dateTimeToString(const QString &format, const QDateTime &datetime,
|
||||
QString QLocalePrivate::dateTimeToString(QStringView format, const QDateTime &datetime,
|
||||
const QDate &dateOnly, const QTime &timeOnly,
|
||||
const QLocale *q) const
|
||||
{
|
||||
|
|
@ -2743,7 +2803,7 @@ QString QLocalePrivate::dateTimeToString(const QString &format, const QDateTime
|
|||
}
|
||||
|
||||
const QChar c = format.at(i);
|
||||
int repeat = qt_repeatCount(format, i);
|
||||
int repeat = qt_repeatCount(format.mid(i));
|
||||
bool used = false;
|
||||
if (formatDate) {
|
||||
switch (c.unicode()) {
|
||||
|
|
@ -2878,7 +2938,7 @@ QString QLocalePrivate::dateTimeToString(const QString &format, const QDateTime
|
|||
|
||||
case 'a':
|
||||
used = true;
|
||||
if (i + 1 < format.length() && format.at(i + 1).unicode() == 'p') {
|
||||
if (i + 1 < format.size() && format.at(i + 1).unicode() == 'p') {
|
||||
repeat = 2;
|
||||
} else {
|
||||
repeat = 1;
|
||||
|
|
@ -2888,7 +2948,7 @@ QString QLocalePrivate::dateTimeToString(const QString &format, const QDateTime
|
|||
|
||||
case 'A':
|
||||
used = true;
|
||||
if (i + 1 < format.length() && format.at(i + 1).unicode() == 'P') {
|
||||
if (i + 1 < format.size() && format.at(i + 1).unicode() == 'P') {
|
||||
repeat = 2;
|
||||
} else {
|
||||
repeat = 1;
|
||||
|
|
|
|||
|
|
@ -972,12 +972,18 @@ public:
|
|||
inline QString toString(uint i) const;
|
||||
QString toString(double i, char f = 'g', int prec = 6) const;
|
||||
inline QString toString(float i, char f = 'g', int prec = 6) const;
|
||||
|
||||
#if QT_STRINGVIEW_LEVEL < 2
|
||||
QString toString(const QDate &date, const QString &formatStr) const;
|
||||
QString toString(const QDate &date, FormatType format = LongFormat) const;
|
||||
QString toString(const QTime &time, const QString &formatStr) const;
|
||||
QString toString(const QDateTime &dateTime, const QString &format) const;
|
||||
#endif
|
||||
QString toString(const QDate &date, QStringView formatStr) const;
|
||||
QString toString(const QTime &time, QStringView formatStr) const;
|
||||
QString toString(const QDateTime &dateTime, QStringView format) const;
|
||||
QString toString(const QDate &date, FormatType format = LongFormat) const;
|
||||
QString toString(const QTime &time, FormatType format = LongFormat) const;
|
||||
QString toString(const QDateTime &dateTime, FormatType format = LongFormat) const;
|
||||
QString toString(const QDateTime &dateTime, const QString &format) const;
|
||||
|
||||
QString dateFormat(FormatType format = LongFormat) const;
|
||||
QString timeFormat(FormatType format = LongFormat) const;
|
||||
|
|
|
|||
|
|
@ -150,7 +150,7 @@ static QString macTimeToString(const QTime &time, bool short_format)
|
|||
// See also qtbase/util/local_database/dateconverter.py
|
||||
// Makes the assumption that input formats are always well formed and consecutive letters
|
||||
// never exceed the maximum for the format code.
|
||||
static QString macToQtFormat(const QString &sys_fmt)
|
||||
static QString macToQtFormat(QStringView sys_fmt)
|
||||
{
|
||||
QString result;
|
||||
int i = 0;
|
||||
|
|
@ -166,7 +166,7 @@ static QString macToQtFormat(const QString &sys_fmt)
|
|||
}
|
||||
|
||||
QChar c = sys_fmt.at(i);
|
||||
int repeat = qt_repeatCount(sys_fmt, i);
|
||||
int repeat = qt_repeatCount(sys_fmt.mid(i));
|
||||
|
||||
switch (c.unicode()) {
|
||||
// Qt does not support the following options
|
||||
|
|
|
|||
|
|
@ -362,7 +362,7 @@ public:
|
|||
|
||||
static void updateSystemPrivate();
|
||||
|
||||
QString dateTimeToString(const QString &format, const QDateTime &datetime,
|
||||
QString dateTimeToString(QStringView format, const QDateTime &datetime,
|
||||
const QDate &dateOnly, const QTime &timeOnly,
|
||||
const QLocale *q) const;
|
||||
|
||||
|
|
@ -412,9 +412,9 @@ inline char QLocaleData::digitToCLocale(QChar in) const
|
|||
return 0;
|
||||
}
|
||||
|
||||
QString qt_readEscapedFormatString(const QString &format, int *idx);
|
||||
QString qt_readEscapedFormatString(QStringView format, int *idx);
|
||||
bool qt_splitLocaleName(const QString &name, QString &lang, QString &script, QString &cntry);
|
||||
int qt_repeatCount(const QString &s, int i);
|
||||
int qt_repeatCount(QStringView s);
|
||||
|
||||
enum { AsciiSpaceMask = (1 << (' ' - 1)) |
|
||||
(1 << ('\t' - 1)) | // 9: HT - horizontal tab
|
||||
|
|
|
|||
|
|
@ -160,7 +160,7 @@ private:
|
|||
SubstitutionType substitution();
|
||||
QString &substituteDigits(QString &string);
|
||||
|
||||
static QString winToQtFormat(const QString &sys_fmt);
|
||||
static QString winToQtFormat(QStringView sys_fmt);
|
||||
|
||||
};
|
||||
Q_GLOBAL_STATIC(QSystemLocalePrivate, systemLocalePrivate)
|
||||
|
|
@ -680,7 +680,7 @@ void QSystemLocalePrivate::update()
|
|||
zero = QChar();
|
||||
}
|
||||
|
||||
QString QSystemLocalePrivate::winToQtFormat(const QString &sys_fmt)
|
||||
QString QSystemLocalePrivate::winToQtFormat(QStringView sys_fmt)
|
||||
{
|
||||
QString result;
|
||||
int i = 0;
|
||||
|
|
@ -696,7 +696,7 @@ QString QSystemLocalePrivate::winToQtFormat(const QString &sys_fmt)
|
|||
}
|
||||
|
||||
QChar c = sys_fmt.at(i);
|
||||
int repeat = qt_repeatCount(sys_fmt, i);
|
||||
int repeat = qt_repeatCount(sys_fmt.mid(i));
|
||||
|
||||
switch (c.unicode()) {
|
||||
// Date
|
||||
|
|
|
|||
|
|
@ -1163,6 +1163,9 @@ void tst_QLocale::dayOfWeek()
|
|||
|
||||
QCOMPARE(QLocale::c().toString(date, "ddd"), shortName);
|
||||
QCOMPARE(QLocale::c().toString(date, "dddd"), longName);
|
||||
|
||||
QCOMPARE(QLocale::c().toString(date, QStringViewLiteral("ddd")), shortName);
|
||||
QCOMPARE(QLocale::c().toString(date, QStringViewLiteral("dddd")), longName);
|
||||
}
|
||||
|
||||
void tst_QLocale::formatDate_data()
|
||||
|
|
@ -1205,6 +1208,7 @@ void tst_QLocale::formatDate()
|
|||
|
||||
QLocale l(QLocale::C);
|
||||
QCOMPARE(l.toString(date, format), result);
|
||||
QCOMPARE(l.toString(date, QStringView(format)), result);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1260,6 +1264,7 @@ void tst_QLocale::formatTime()
|
|||
|
||||
QLocale l(QLocale::C);
|
||||
QCOMPARE(l.toString(time, format), result);
|
||||
QCOMPARE(l.toString(time, QStringView(format)), result);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1421,6 +1426,7 @@ void tst_QLocale::formatDateTime()
|
|||
|
||||
QLocale l(localeName);
|
||||
QCOMPARE(l.toString(dateTime, format), result);
|
||||
QCOMPARE(l.toString(dateTime, QStringView(format)), result);
|
||||
}
|
||||
|
||||
void tst_QLocale::formatTimeZone()
|
||||
|
|
|
|||
Loading…
Reference in New Issue