8#if defined(Q_CC_GNU_ONLY) && Q_CC_GNU >= 1000
10
11
12
13
14
15
16
17QT_WARNING_DISABLE_GCC(
"-Wfree-nonheap-object")
20#if defined(Q_OS_MACOS)
21# include "private/qcore_mac_p.h"
22# include <CoreFoundation/CoreFoundation.h>
25#include "qplatformdefs.h"
30#include "private/qduplicatetracker_p.h"
37#include <private/qtools_p.h>
38#if QT_CONFIG(datetimeparser)
39#include "private/qdatetimeparser_p.h"
47#if QT_CONFIG(timezone)
48# include "qtimezone.h"
50#include "private/qnumeric_p.h"
51#include "private/qtools_p.h"
53#ifndef QT_NO_SYSTEMLOCALE
57# include <qt_windows.h>
61#include "private/qcalendarbackend_p.h"
62#include "private/qgregoriancalendar_p.h"
63#if QT_CONFIG(timezone) && QT_CONFIG(timezone_locale) && !QT_CONFIG(icu)
64# include "private/qtimezonelocale_p.h"
67#include <q20iterator.h>
71constexpr int QLocale::DefaultTwoDigitBaseYear;
73QT_IMPL_METATYPE_EXTERN_TAGGED(QList<Qt::DayOfWeek>, QList_Qt__DayOfWeek)
74#ifndef QT_NO_SYSTEMLOCALE
75QT_IMPL_METATYPE_EXTERN_TAGGED(QSystemLocale::CurrencyToStringArgument,
76 QSystemLocale__CurrencyToStringArgument)
79using namespace Qt::StringLiterals;
80using namespace QtMiscUtils;
82#ifndef QT_NO_SYSTEMLOCALE
83Q_CONSTINIT
static QSystemLocale *_systemLocale =
nullptr;
84Q_CONSTINIT
static QLocaleData systemLocaleData = {};
87static_assert(ascii_isspace(
' '));
88static_assert(ascii_isspace(
'\t'));
89static_assert(ascii_isspace(
'\n'));
90static_assert(ascii_isspace(
'\v'));
91static_assert(ascii_isspace(
'\f'));
92static_assert(ascii_isspace(
'\r'));
93static_assert(!ascii_isspace(
'\0'));
94static_assert(!ascii_isspace(
'\a'));
95static_assert(!ascii_isspace(
'a'));
96static_assert(!ascii_isspace(
'\177'));
97static_assert(!ascii_isspace(uchar(
'\200')));
98static_assert(!ascii_isspace(uchar(
'\xA0')));
99static_assert(!ascii_isspace(uchar(
'\377')));
102
103
105QT_BEGIN_INCLUDE_NAMESPACE
107QT_END_INCLUDE_NAMESPACE
109QLocale::Language QLocalePrivate::codeToLanguage(QStringView code,
110 QLocale::LanguageCodeTypes codeTypes)
noexcept
112 const auto len = code.size();
113 if (len != 2 && len != 3)
114 return QLocale::AnyLanguage;
116 const char16_t uc1 = code[0].toLower().unicode();
117 const char16_t uc2 = code[1].toLower().unicode();
118 const char16_t uc3 = len > 2 ? code[2].toLower().unicode() : 0;
121 if (uc1 > 0x7F || uc2 > 0x7F || uc3 > 0x7F)
122 return QLocale::AnyLanguage;
124 const AlphaCode codeBuf = {
char(uc1),
char(uc2),
char(uc3) };
126 auto searchCode = [codeBuf](
auto f) {
127 return std::find_if(languageCodeList.begin(), languageCodeList.end(),
128 [=](LanguageCodeEntry i) {
return f(i) == codeBuf; });
131 if (codeTypes.testFlag(QLocale::ISO639Part1) && uc3 == 0) {
132 auto i = searchCode([](LanguageCodeEntry i) {
return i.part1; });
133 if (i != languageCodeList.end())
134 return QLocale::Language(std::distance(languageCodeList.begin(), i));
138 if (codeTypes.testFlag(QLocale::ISO639Part2B)) {
139 auto i = searchCode([](LanguageCodeEntry i) {
return i.part2B; });
140 if (i != languageCodeList.end())
141 return QLocale::Language(std::distance(languageCodeList.begin(), i));
146 if (codeTypes.testFlag(QLocale::ISO639Part2T)
147 && !codeTypes.testFlag(QLocale::ISO639Part3)) {
148 auto i = searchCode([](LanguageCodeEntry i) {
return i.part2T; });
149 if (i != languageCodeList.end())
150 return QLocale::Language(std::distance(languageCodeList.begin(), i));
153 if (codeTypes.testFlag(QLocale::ISO639Part3)) {
154 auto i = searchCode([](LanguageCodeEntry i) {
return i.part3; });
155 if (i != languageCodeList.end())
156 return QLocale::Language(std::distance(languageCodeList.begin(), i));
160 if (codeTypes.testFlag(QLocale::LegacyLanguageCode) && uc3 == 0) {
162 if (uc1 ==
'n' && uc2 ==
'o')
163 return QLocale::NorwegianBokmal;
164 if (uc1 ==
't' && uc2 ==
'l')
165 return QLocale::Filipino;
166 if (uc1 ==
's' && uc2 ==
'h')
167 return QLocale::Serbian;
168 if (uc1 ==
'm' && uc2 ==
'o')
169 return QLocale::Romanian;
171 if (uc1 ==
'i' && uc2 ==
'w')
172 return QLocale::Hebrew;
173 if (uc1 ==
'i' && uc2 ==
'n')
174 return QLocale::Indonesian;
175 if (uc1 ==
'j' && uc2 ==
'i')
176 return QLocale::Yiddish;
178 return QLocale::AnyLanguage;
183 if (code.size() != 4)
188 const unsigned char c0 = (fixCase ? code[0].toUpper() : code[0]).toLatin1();
189 const unsigned char c1 = (fixCase ? code[1].toLower() : code[1]).toLatin1();
190 const unsigned char c2 = (fixCase ? code[2].toLower() : code[2]).toLatin1();
191 const unsigned char c3 = (fixCase ? code[3].toLower() : code[3]).toLatin1();
193 if (!c0 || !c1 || !c2 || !c3)
197 for (qsizetype i = 0; i < QLocale::LastScript; ++i, c += 4) {
198 if (c0 == c[0] && c1 == c[1] && c2 == c[2] && c3 == c[3])
206 qsizetype index = scriptIndex(code, Qt::CaseInsensitive);
207 return index < 0 ? QLocale::AnyScript : QLocale::Script(index);
212 const auto len = code.size();
213 if (len != 2 && len != 3)
214 return QLocale::AnyTerritory;
216 char16_t uc1 = code[0].toUpper().unicode();
217 char16_t uc2 = code[1].toUpper().unicode();
218 char16_t uc3 = len > 2 ? code[2].toUpper().unicode() : 0;
221 for (; *c != 0; c += 3) {
222 if (uc1 == c[0] && uc2 == c[1] && uc3 == c[2])
223 return QLocale::Territory((c - territory_code_list)/3);
226 return QLocale::AnyTerritory;
230 QLocale::LanguageCodeTypes codeTypes)
232 if (language == QLocale::AnyLanguage || language > QLocale::LastLanguage)
234 if (language == QLocale::C)
239 if (codeTypes.testFlag(QLocale::ISO639Part1) && i.part1.isValid())
242 if (codeTypes.testFlag(QLocale::ISO639Part2B) && i.part2B.isValid())
245 if (codeTypes.testFlag(QLocale::ISO639Part2T) && i.part2T.isValid())
248 if (codeTypes.testFlag(QLocale::ISO639Part3))
256 if (script == QLocale::AnyScript || script > QLocale::LastScript)
259 return {
reinterpret_cast<
const char *>(c), 4};
264 if (territory == QLocale::AnyTerritory || territory > QLocale::LastTerritory)
268 return {
reinterpret_cast<
const char*>(c), c[2] == 0 ? 2 : 3};
278bool operator<(LikelyPair lhs, LikelyPair rhs)
282 const auto compare = [](
int lhs,
int rhs) {
284 const int huge = 0x10000;
285 return (lhs ? lhs : huge) - (rhs ? rhs : huge);
287 const auto &left = lhs.key;
288 const auto &right = rhs.key;
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
324
325
326
327
328
329
330
331
332
333
334
335
336
338 auto *pairs =
reinterpret_cast<
const LikelyPair *>(
likely_subtags);
340 LikelyPair sought { *
this };
345 pairs =
std::lower_bound(pairs, afterPairs, sought);
365 pairs =
std::lower_bound(pairs, afterPairs, sought);
384 pairs =
std::lower_bound(pairs, afterPairs, sought);
396 pairs = afterPairs - 1;
436 if (language_id == QLocale::AnyLanguage)
438 if (language_id == QLocale::C)
439 return QByteArrayLiteral(
"C");
440 Q_ASSERT(language_id <= QLocale::LastLanguage);
441 Q_ASSERT(script_id <= QLocale::LastScript);
442 Q_ASSERT(territory_id <= QLocale::LastTerritory);
448 if (language
.part1.isValid()) {
456 const unsigned char *script =
457 (script_id != QLocale::AnyScript ? script_code_list + 4 * script_id :
nullptr);
458 const unsigned char *country =
459 (territory_id != QLocale::AnyTerritory
460 ? territory_code_list + 3 * territory_id :
nullptr);
461 qsizetype len = langLen + (script ? 4 + 1 : 0) + (country ? (country[2] != 0 ? 3 : 2) + 1 : 0);
463 char *uc = name.data();
465 auto langArray = lang.decode();
467 *uc++ = langArray[0];
468 *uc++ = langArray[1];
470 *uc++ = langArray[2];
491 if (m_data->m_language_id == QLocale::AnyLanguage)
493 if (m_data->m_language_id == QLocale::C)
494 return QByteArrayView(
"en") % separator % QByteArrayView(
"POSIX");
501 qsizetype idx = locale_index[localeId.language_id];
504 if (localeId.language_id && idx == 0)
507 Q_ASSERT(localeId.acceptLanguage(locale_data[idx].m_language_id));
510 if (localeId.acceptScriptTerritory(locale_data[idx].id()))
513 }
while (localeId.acceptLanguage(locale_data[idx].m_language_id));
519bool QLocaleData::allLocaleDataRows(
bool (*check)(qsizetype,
const QLocaleData &))
521 for (qsizetype index = 0; index < locale_data_size; ++index) {
522 if (!(*check)(index, locale_data[index]))
528#if QT_CONFIG(timezone) && QT_CONFIG(timezone_locale) && !QT_CONFIG(icu)
529namespace QtTimeZoneLocale {
532QList<qsizetype> fallbackLocalesFor(qsizetype index)
536 Q_ASSERT(index < locale_data_size);
537 QList<qsizetype> result = {index};
538 QLocaleId id = locale_data[index].id();
539 if (id.language_id == QLocale::C) {
540 id = { QLocale::English, QLocale::LatinScript, QLocale::UnitedStates };
541 qsizetype it = findLocaleIndexById(id);
542 Q_ASSERT_X(it != -1, Q_FUNC_INFO,
"Missing en_Latn_US from locale data");
543 Q_ASSERT_X(it != index,
544 Q_FUNC_INFO,
"en_Latn_US != C");
548 const QLocaleId base = id;
549 QLocaleId likely = id.withLikelySubtagsAdded();
550 if (likely != base) {
551 qsizetype it = findLocaleIndexById(likely);
552 if (it != -1 && !result.contains(it))
555 if (id.territory_id) {
557 likely = id.withLikelySubtagsAdded();
558 if (likely != base) {
559 qsizetype it = findLocaleIndexById(likely);
560 if (it != -1 && !result.contains(it))
566 likely = id.withLikelySubtagsAdded();
567 if (likely != base) {
568 qsizetype it = findLocaleIndexById(likely);
569 if (it != -1 && !result.contains(it))
586 qsizetype index = findLocaleIndexById(likelyId);
590 tried.push_back(likelyId);
592#define CheckCandidate(id) do {
593 if (!tried.contains(id)) {
594 index = findLocaleIndexById(id);
626 return locale_index[fallback];
631 const std::u16string_view v(name.utf16(), size_t(name.size()));
632 const auto i = v.find_first_of(u"_-.@");
633 if (i == std::string_view::npos)
635 return name.first(qsizetype(i));
641 for (QChar uc : tag) {
642 const char16_t ch = uc.unicode();
643 if (!isAsciiLetterOrNumber(ch))
646 return tag.size() > 0;
650 QStringView *lang, QStringView *script, QStringView *land)
noexcept
653 enum ParserState { NoState, LangState, ScriptState, CountryState };
654 ParserState state = LangState;
655 while (name.size() && state != NoState) {
656 const QStringView tag = findTag(name);
659 name = name.sliced(tag.size());
660 const bool sep = name.size() > 0;
662 name = name.sliced(1);
666 if (tag.size() != 2 && tag.size() != 3)
670 state = sep ? ScriptState : NoState;
676 state = sep ? CountryState : NoState;
691 return state != LangState;
699 if (!qt_splitLocaleName(name, &lang, &script, &land))
700 return { QLocale::C, 0, 0 };
703 if (land.compare(
"POSIX", Qt::CaseInsensitive) == 0)
704 return { QLocale::C, 0, 0 };
706 QLocale::Language langId = QLocalePrivate::codeToLanguage(lang);
707 if (langId == QLocale::AnyLanguage)
708 return { QLocale::C, 0, 0 };
709 return { langId, QLocalePrivate::codeToScript(script), QLocalePrivate::codeToTerritory(land) };
716 Q_ASSERT(format.at(i) == u'\'');
718 if (i == format.size())
720 if (format.at(i).unicode() ==
'\'') {
727 while (i < format.size()) {
728 if (format.at(i).unicode() ==
'\'') {
729 if (format.mid(i + 1).startsWith(u'\'')) {
731 result.append(u'\'');
737 result.append(format.at(i++));
740 if (i < format.size())
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
766 const QChar c = s.front();
768 while (j < s.size() && s.at(j) == c)
773Q_CONSTINIT
static const QLocaleData *default_data =
nullptr;
774Q_CONSTINIT QBasicAtomicInt QLocalePrivate::s_generation = Q_BASIC_ATOMIC_INITIALIZER(0);
778 Q_CONSTINIT
static QLocalePrivate c_locale(locale_data, 0, QLocale::OmitGroupSeparator, 1);
784 return forLanguage == QLocale::C ? QLocale::OmitGroupSeparator : QLocale::DefaultNumberOptions;
789 return defaultNumberOptions(QLocale::Language(forLanguage));
792#ifndef QT_NO_SYSTEMLOCALE
794
795
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817QSystemLocale::QSystemLocale() : next(_systemLocale)
819 _systemLocale =
this;
821 systemLocaleData.m_language_id = 0;
825
826
827
828QSystemLocale::~QSystemLocale()
830 if (_systemLocale ==
this) {
831 _systemLocale = next;
834 systemLocaleData.m_language_id = 0;
836 for (QSystemLocale *p = _systemLocale; p; p = p->next) {
846 return _systemLocale;
851 static QSystemLocale globalInstance;
852 return &globalInstance;
860 const QSystemLocale *sys_locale = systemLocale();
863 sys_locale->query(QSystemLocale::LocaleChanged);
866 systemLocaleData = locale_data[sys_locale->fallbackLocaleIndex()];
868 QVariant res = sys_locale->query(QSystemLocale::LanguageId);
870 systemLocaleData.m_language_id = res.toInt();
871 systemLocaleData.m_script_id = QLocale::AnyScript;
873 res = sys_locale->query(QSystemLocale::TerritoryId);
875 systemLocaleData.m_territory_id = res.toInt();
876 systemLocaleData.m_script_id = QLocale::AnyScript;
878 res = sys_locale->query(QSystemLocale::ScriptId);
880 systemLocaleData.m_script_id = res.toInt();
885 if (default_data == &systemLocaleData)
886 QLocalePrivate::s_generation.fetchAndAddRelaxed(1);
892#ifndef QT_NO_SYSTEMLOCALE
894
895
896
897
898
899
900
902 Q_CONSTINIT
static QLocaleId sysId;
903 bool updated =
false;
905 Q_CONSTINIT
static QBasicMutex systemDataMutex;
906 systemDataMutex.lock();
907 if (systemLocaleData.m_language_id == 0) {
908 updateSystemPrivate();
912 if (sysIndex && (updated || *sysIndex < 0)) {
913 const QLocaleId nowId = systemLocaleData.id();
914 if (sysId != nowId || *sysIndex < 0) {
916 *sysIndex = QLocaleData::findLocaleIndex(nowId);
920 systemDataMutex.unlock();
923 return &systemLocaleData;
933 default_data = systemData();
940#ifndef QT_NO_SYSTEMLOCALE
941 if (data == &systemLocaleData) {
944 return QLocaleData::findLocaleIndex(data->id());
955 Q_ASSERT(locale_index[QLocale::C] == 0);
959#ifndef QT_NO_DATASTREAM
960QDataStream &operator<<(QDataStream &ds,
const QLocale &l)
966QDataStream &
operator>>(QDataStream &ds, QLocale &l)
976 new QLocalePrivate(defaultData(), defaultIndex(),
977 defaultNumberOptions(defaultData()->m_language_id)))
983 const qsizetype index = QLocaleData::findLocaleIndex(QLocaleId::fromName(name));
984 Q_ASSERT(index >= 0 && index < locale_data_size);
985 return new QLocalePrivate(locale_data + index, index,
986 defaultNumberOptions(locale_data[index].m_language_id));
990 QLocale::Territory territory)
992 if (language == QLocale::C)
995 qsizetype index = QLocaleData::findLocaleIndex(QLocaleId { language, script, territory });
999 QLocale::NumberOptions numberOptions = QLocale::DefaultNumberOptions;
1002 if (data->m_language_id == QLocale::C) {
1003 if (defaultLocalePrivate.exists())
1004 numberOptions = defaultLocalePrivate->data()->m_numberOptions;
1006 index = defaultIndex();
1014 auto compareWithPrivate = [&loc](
const QLocaleData *data, QLocale::NumberOptions opts)
1016 return loc.d->m_data == data && loc.d->m_numberOptions == opts;
1019 if (lang == QLocale::C)
1022 qsizetype index = QLocaleData::findLocaleIndex(QLocaleId { lang });
1026 QLocale::NumberOptions numberOptions = QLocale::DefaultNumberOptions;
1029 if (data->m_language_id == QLocale::C) {
1030 if (defaultLocalePrivate.exists())
1031 numberOptions = defaultLocalePrivate->data()->m_numberOptions;
1034 return compareWithPrivate(data, numberOptions);
1037static std::optional<QString>
1040#ifndef QT_NO_SYSTEMLOCALE
1041 if (that != &systemLocaleData)
1042 return std::nullopt;
1044 QVariant v = systemLocale()->query(type);
1045 if (v.metaType() != QMetaType::fromType<QString>())
1046 return std::nullopt;
1048 return v.toString();
1052 return std::nullopt;
1059 if (
auto opt = systemLocaleString(that, type))
1066 return localeString(
this, QSystemLocale::DecimalPoint, decimalSeparator());
1071 return localeString(
this, QSystemLocale::GroupSeparator, groupDelim());
1086 return localeString(
this, QSystemLocale::ZeroDigit, zero());
1091#ifndef QT_NO_SYSTEMLOCALE
1092 if (
this == &systemLocaleData) {
1093 const auto text = systemLocale()->query(QSystemLocale::ZeroDigit).toString();
1094 if (!text.isEmpty()) {
1095 if (text.size() == 1 && !text.at(0).isSurrogate())
1096 return text.at(0).unicode();
1097 if (text.size() == 2 && text.at(0).isHighSurrogate())
1098 return QChar::surrogateToUcs4(text.at(0), text.at(1));
1107 return localeString(
this, QSystemLocale::NegativeSign, minus());
1112 return localeString(
this, QSystemLocale::PositiveSign, plus());
1122#ifndef QT_NO_SYSTEMLOCALE
1123 if (
this == &systemLocaleData) {
1124 QVariant queryResult = systemLocale()->query(QSystemLocale::Grouping);
1125 if (!queryResult.isNull()) {
1128 if (sysGroupSizes.first <= 0)
1129 sysGroupSizes.first = m_grouping_first;
1130 if (sysGroupSizes.higher <= 0)
1131 sysGroupSizes.higher = m_grouping_higher;
1132 if (sysGroupSizes.least <= 0)
1133 sysGroupSizes.least = m_grouping_least;
1134 return sysGroupSizes;
1138 return { m_grouping_first,
1144
1145
1146QLocale::QLocale(QLocalePrivate &dd)
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195QLocale::QLocale(QStringView name)
1196 : d(localePrivateByName(name))
1201
1202
1203
1206
1207
1208
1209
1210
1211
1212
1217 if (!defaultLocalePrivate.isDestroyed()) {
1220 d = *defaultLocalePrivate;
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1236QLocale::QLocale(Language language, Territory territory)
1237 : d(findLocalePrivate(language, AnyScript, territory))
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1260QLocale::QLocale(Language language, Script script, Territory territory)
1261 : d(findLocalePrivate(language, script, territory))
1266
1267
1269QLocale::QLocale(
const QLocale &other)
noexcept =
default;
1272
1273
1280
1281
1282
1284QLocale &QLocale::operator=(
const QLocale &other)
noexcept =
default;
1287
1288
1289
1291bool QLocale::equals(
const QLocale &other)
const noexcept
1293 return d->m_data == other.d->m_data && d->m_numberOptions == other.d->m_numberOptions;
1297
1298
1299
1300
1303
1304
1305
1308 return qHashMulti(seed, key.d->m_data, key.d->m_numberOptions);
1312
1313
1314
1315
1316
1317
1318void QLocale::setNumberOptions(NumberOptions options)
1320 d->m_numberOptions = options;
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333QLocale::NumberOptions QLocale::numberOptions()
const
1335 return d->m_numberOptions;
1339
1340
1341
1342
1343
1344
1345
1348
1349
1350
1351
1352QString QLocale::quoteString(QStringView str, QuotationStyle style)
const
1354#ifndef QT_NO_SYSTEMLOCALE
1355 if (d->m_data == &systemLocaleData) {
1357 if (style == AlternateQuotation)
1358 res = systemLocale()->query(QSystemLocale::StringToAlternateQuotation,
1359 QVariant::fromValue(str));
1360 if (res.isNull() || style == StandardQuotation)
1361 res = systemLocale()->query(QSystemLocale::StringToStandardQuotation,
1362 QVariant::fromValue(str));
1364 return res.toString();
1368 QLocaleData::DataRange start, end;
1369 if (style == StandardQuotation) {
1370 start = d->m_data->quoteStart();
1371 end = d->m_data->quoteEnd();
1373 start = d->m_data->quoteStartAlternate();
1374 end = d->m_data->quoteEndAlternate();
1377 return start.viewData(single_character_data) % str % end.viewData(single_character_data);
1381
1382
1383
1384
1385
1386QString QLocale::createSeparatedList(
const QStringList &list)
const
1389#ifndef QT_NO_SYSTEMLOCALE
1390 if (d->m_data == &systemLocaleData) {
1392 systemLocale()->query(QSystemLocale::ListToSeparatedString, QVariant::fromValue(list));
1395 return res.toString();
1399 const qsizetype size = list.size();
1407 return d->m_data->pairListPattern().getData(
1408 list_pattern_part_data).arg(list.at(0), list.at(1));
1410 QStringView formatStart = d->m_data->startListPattern().viewData(list_pattern_part_data);
1411 QStringView formatMid = d->m_data->midListPattern().viewData(list_pattern_part_data);
1412 QStringView formatEnd = d->m_data->endListPattern().viewData(list_pattern_part_data);
1413 QString result = formatStart.arg(list.at(0), list.at(1));
1414 for (qsizetype i = 2; i < size - 1; ++i)
1415 result = formatMid.arg(result, list.at(i));
1416 result = formatEnd.arg(result, list.at(size - 1));
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1434void QLocale::setDefault(
const QLocale &locale)
1436 default_data = locale.d->m_data;
1438 if (defaultLocalePrivate.isDestroyed())
1440 if (!defaultLocalePrivate.exists()) {
1443 Q_ASSERT(defaultLocalePrivate.exists());
1447 *defaultLocalePrivate = locale.d;
1448 QLocalePrivate::s_generation.fetchAndAddRelaxed(1);
1452
1453
1454
1455
1456QLocale::Language QLocale::language()
const
1458 return Language(d->languageId());
1462
1463
1464
1465
1466
1467
1468QLocale::Script QLocale::script()
const
1470 return Script(d->m_data->m_script_id);
1474
1475
1476
1477
1478
1479
1480QLocale::Territory QLocale::territory()
const
1482 return Territory(d->territoryId());
1485#if QT_DEPRECATED_SINCE(6
, 6
)
1487
1488
1489
1490
1491
1492
1493QLocale::Country QLocale::country()
const
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1527 qWarning(
"QLocale::%s(): Using non-ASCII separator '%c' (%02x) is unsupported",
1528 method, sep, uint(uchar(sep)));
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1551QString QLocale::name(TagSeparator separator)
const
1553 const char sep =
char(separator);
1554 if (uchar(sep) > 0x7f) {
1555 badSeparatorWarning(
"name", sep);
1558 const auto code = d->languageCode();
1559 QLatin1StringView view{code.data()};
1561 Language l = language();
1565 Territory c = territory();
1566 if (c == AnyTerritory)
1569 return view + QLatin1Char(sep) + d->territoryCode();
1572template <
typename T>
static inline
1575 constexpr bool isUnsigned =
std::is_unsigned_v<T>;
1576 using Int64 =
typename std::conditional_t<isUnsigned, quint64, qint64>;
1578 QSimpleParsedNumber<Int64> r{};
1579 if constexpr (isUnsigned)
1580 r = d
->m_data->stringToUnsLongLong(str, 10, d->m_numberOptions);
1582 r = d
->m_data->stringToLongLong(str, 10, d->m_numberOptions);
1587 Int64 val = r.result;
1588 if (T(val) != val) {
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621QString QLocale::bcp47Name(TagSeparator separator)
const
1623 const char sep =
char(separator);
1624 if (uchar(sep) > 0x7f) {
1625 badSeparatorWarning(
"bcp47Name", sep);
1628 return QString::fromLatin1(d->bcp47Name(sep));
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649QString QLocale::languageToCode(Language language, LanguageCodeTypes codeTypes)
1651 const auto code = QLocalePrivate::languageToCode(language, codeTypes);
1652 return QLatin1StringView{code.data()};
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669QLocale::Language QLocale::codeToLanguage(QStringView languageCode,
1670 LanguageCodeTypes codeTypes)
noexcept
1672 return QLocalePrivate::codeToLanguage(languageCode, codeTypes);
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685QString QLocale::territoryToCode(QLocale::Territory territory)
1687 return QLocalePrivate::territoryToCode(territory);
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700QLocale::Territory QLocale::codeToTerritory(QStringView territoryCode)
noexcept
1702 return QLocalePrivate::codeToTerritory(territoryCode);
1705#if QT_DEPRECATED_SINCE(6
, 6
)
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716QString QLocale::countryToCode(Country country)
1718 return territoryToCode(country);
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731QLocale::Country QLocale::codeToCountry(QStringView countryCode)
noexcept
1733 return QLocalePrivate::codeToTerritory(countryCode);
1738
1739
1740
1741
1742
1743
1744
1745
1746QString QLocale::scriptToCode(Script script)
1748 return QLocalePrivate::scriptToCode(script);
1752
1753
1754
1755
1756
1757
1758
1759
1760QLocale::Script QLocale::codeToScript(QStringView scriptCode)
noexcept
1762 return QLocalePrivate::codeToScript(scriptCode);
1766
1767
1768
1769
1771QString QLocale::languageToString(Language language)
1773 if (language > LastLanguage)
1774 return "Unknown"_L1;
1775 return QString::fromUtf8(language_name_list + language_name_index[language]);
1779
1780
1781
1782
1783
1784
1785QString QLocale::territoryToString(Territory territory)
1787 if (territory > LastTerritory)
1788 return "Unknown"_L1;
1789 return QString::fromUtf8(territory_name_list + territory_name_index[territory]);
1792#if QT_DEPRECATED_SINCE(6
, 6
)
1794
1795
1796
1797
1798
1799
1800QString QLocale::countryToString(Country country)
1802 return territoryToString(country);
1807
1808
1809
1810
1811
1812
1813QString QLocale::scriptToString(Script script)
1815 if (script > LastScript)
1816 return "Unknown"_L1;
1817 return QString::fromUtf8(script_name_list + script_name_index[script]);
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1992short QLocale::toShort(QStringView s,
bool *ok)
const
1994 return toIntegral_helper<
short>(d, s, ok);
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2012ushort QLocale::toUShort(QStringView s,
bool *ok)
const
2014 return toIntegral_helper<ushort>(d, s, ok);
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2032int QLocale::toInt(QStringView s,
bool *ok)
const
2034 return toIntegral_helper<
int>(d, s, ok);
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2052uint QLocale::toUInt(QStringView s,
bool *ok)
const
2054 return toIntegral_helper<uint>(d, s, ok);
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2071long QLocale::toLong(QStringView s,
bool *ok)
const
2073 return toIntegral_helper<
long>(d, s, ok);
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2091ulong QLocale::toULong(QStringView s,
bool *ok)
const
2093 return toIntegral_helper<ulong>(d, s, ok);
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2112qlonglong QLocale::toLongLong(QStringView s,
bool *ok)
const
2114 return toIntegral_helper<qlonglong>(d, s, ok);
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2133qulonglong QLocale::toULongLong(QStringView s,
bool *ok)
const
2135 return toIntegral_helper<qulonglong>(d, s, ok);
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2154float QLocale::toFloat(QStringView s,
bool *ok)
const
2156 return QLocaleData::convertDoubleToFloat(toDouble(s, ok), ok);
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2180double QLocale::toDouble(QStringView s,
bool *ok)
const
2182 return d->m_data->stringToDouble(s, ok, d->m_numberOptions);
2186
2187
2188
2189
2191QString QLocale::toString(qlonglong i)
const
2193 int flags = (d->m_numberOptions & OmitGroupSeparator
2194 ? 0 : QLocaleData::GroupDigits);
2196 return d->m_data->longLongToString(i, -1, 10, -1, flags);
2200
2201
2202
2203
2205QString QLocale::toString(qulonglong i)
const
2207 int flags = (d->m_numberOptions & OmitGroupSeparator
2208 ? 0 : QLocaleData::GroupDigits);
2210 return d->m_data->unsLongLongToString(i, -1, 10, -1, flags);
2216 qsizetype count = 0;
2219 [[maybe_unused]]
auto ch = counter
.next();
2225 const QLocale &locale)
2228 if (!(locale.numberOptions() & QLocale::OmitGroupSeparator))
2232 else if (fillChar == U'0')
2244 if (fillChar == U'0') {
2245 Q_ASSERT(fieldWidth < 0);
2246 filler = localeData->zeroDigit();
2248 filler = QString(QChar::fromUcs4(fillChar));
2252 filler = filler.repeated(padding);
2257
2258
2259
2260
2261
2262
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282QString QLocale::toString(qlonglong number,
int fieldWidth,
char32_t fillChar)
const
2284 int absFieldWidth = qAbs(fieldWidth);
2285 int width = (fillChar == U'0') ? absFieldWidth : -1;
2286 unsigned flags = calculateFlags(fieldWidth, fillChar, *
this);
2288 QString result = d->m_data->longLongToString(number, -1, 10, width, flags);
2289 qsizetype padding = absFieldWidth - stringWidth(result);
2292 QString filler = calculateFiller(padding, fillChar, fieldWidth, d->m_data);
2294 result.append(filler);
2296 result.prepend(filler);
2302
2303
2304
2305
2306
2307
2309
2310
2311
2312QString QLocale::toString(qulonglong number,
int fieldWidth,
char32_t fillChar)
const
2314 int absFieldWidth = qAbs(fieldWidth);
2315 int width = (fillChar == U'0') ? absFieldWidth : -1;
2316 unsigned flags = calculateFlags(fieldWidth, fillChar, *
this);
2318 QString result = d->m_data->unsLongLongToString(number, -1, 10, width, flags);
2319 qsizetype padding = absFieldWidth - stringWidth(result);
2322 QString filler = calculateFiller(padding, fillChar, fieldWidth, d->m_data);
2324 result.append(filler);
2326 result.prepend(filler);
2332
2333
2334
2335
2336
2337
2339QString QLocale::toString(QDate date,
const QString &format)
const
2341 return toString(date, qToStringViewIgnoringNull(format));
2345
2346
2347
2348
2349
2350
2352QString QLocale::toString(QTime time,
const QString &format)
const
2354 return toString(time, qToStringViewIgnoringNull(format));
2358
2359
2360
2361
2362
2363
2364
2365
2366
2369
2370
2371
2372
2373
2374
2375
2376
2377QString QLocale::toString(QDate date, QStringView format, QCalendar cal)
const
2379 return cal.dateTimeToString(format, QDateTime(), date, QTime(), *
this);
2383
2384
2385
2386QString QLocale::toString(QDate date, QStringView format)
const
2388 return QCalendar().dateTimeToString(format, QDateTime(), date, QTime(), *
this);
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401QString QLocale::toString(QDate date, FormatType format, QCalendar cal)
const
2403 if (!date.isValid())
2406#ifndef QT_NO_SYSTEMLOCALE
2407 if (cal.isGregorian() && d->m_data == &systemLocaleData) {
2408 QVariant res = systemLocale()->query(format == LongFormat
2409 ? QSystemLocale::DateToStringLong
2410 : QSystemLocale::DateToStringShort,
2413 return res.toString();
2417 QString format_str = dateFormat(format);
2418 return toString(date, format_str, cal);
2422
2423
2424
2425QString QLocale::toString(QDate date, FormatType format)
const
2427 if (!date.isValid())
2430#ifndef QT_NO_SYSTEMLOCALE
2431 if (d->m_data == &systemLocaleData) {
2432 QVariant res = systemLocale()->query(format == LongFormat
2433 ? QSystemLocale::DateToStringLong
2434 : QSystemLocale::DateToStringShort,
2437 return res.toString();
2441 QString format_str = dateFormat(format);
2442 return toString(date, format_str);
2448 while (i < format.size()) {
2449 if (format.at(i).unicode() ==
'\'') {
2450 qt_readEscapedFormatString(format, &i);
2454 if (format.at(i).toLower().unicode() ==
'a')
2463
2464
2465
2466
2467
2468
2469
2470
2471QString QLocale::toString(QTime time, QStringView format)
const
2473 return QCalendar().dateTimeToString(format, QDateTime(), QDate(), time, *
this);
2477
2478
2479
2480
2481
2482
2483
2484
2485QString QLocale::toString(
const QDateTime &dateTime, QStringView format, QCalendar cal)
const
2487 return cal.dateTimeToString(format, dateTime, QDate(), QTime(), *
this);
2491
2492
2493
2494QString QLocale::toString(
const QDateTime &dateTime, QStringView format)
const
2496 return QCalendar().dateTimeToString(format, dateTime, QDate(), QTime(), *
this);
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509QString QLocale::toString(
const QDateTime &dateTime, FormatType format, QCalendar cal)
const
2511 if (!dateTime.isValid())
2514#ifndef QT_NO_SYSTEMLOCALE
2515 if (cal.isGregorian() && d->m_data == &systemLocaleData) {
2516 QVariant res = systemLocale()->query(format == LongFormat
2517 ? QSystemLocale::DateTimeToStringLong
2518 : QSystemLocale::DateTimeToStringShort,
2521 return res.toString();
2525 const QString format_str = dateTimeFormat(format);
2526 return toString(dateTime, format_str, cal);
2530
2531
2532
2533QString QLocale::toString(
const QDateTime &dateTime, FormatType format)
const
2535 if (!dateTime.isValid())
2538#ifndef QT_NO_SYSTEMLOCALE
2539 if (d->m_data == &systemLocaleData) {
2540 QVariant res = systemLocale()->query(format == LongFormat
2541 ? QSystemLocale::DateTimeToStringLong
2542 : QSystemLocale::DateTimeToStringShort,
2545 return res.toString();
2549 const QString format_str = dateTimeFormat(format);
2550 return toString(dateTime, format_str);
2555
2556
2557
2559QString QLocale::toString(QTime time, FormatType format)
const
2561 if (!time.isValid())
2564#ifndef QT_NO_SYSTEMLOCALE
2565 if (d->m_data == &systemLocaleData) {
2566 QVariant res = systemLocale()->query(format == LongFormat
2567 ? QSystemLocale::TimeToStringLong
2568 : QSystemLocale::TimeToStringShort,
2571 return res.toString();
2575 QString format_str = timeFormat(format);
2576 return toString(time, format_str);
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2591QString QLocale::dateFormat(FormatType format)
const
2593#ifndef QT_NO_SYSTEMLOCALE
2594 if (d->m_data == &systemLocaleData) {
2595 QVariant res = systemLocale()->query(format == LongFormat
2596 ? QSystemLocale::DateFormatLong
2597 : QSystemLocale::DateFormatShort,
2600 return res.toString();
2604 return (format == LongFormat
2605 ? d->m_data->longDateFormat()
2606 : d->m_data->shortDateFormat()
2607 ).getData(date_format_data);
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2622QString QLocale::timeFormat(FormatType format)
const
2624#ifndef QT_NO_SYSTEMLOCALE
2625 if (d->m_data == &systemLocaleData) {
2626 QVariant res = systemLocale()->query(format == LongFormat
2627 ? QSystemLocale::TimeFormatLong
2628 : QSystemLocale::TimeFormatShort,
2631 return res.toString();
2635 return (format == LongFormat
2636 ? d->m_data->longTimeFormat()
2637 : d->m_data->shortTimeFormat()
2638 ).getData(time_format_data);
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2653QString QLocale::dateTimeFormat(FormatType format)
const
2655#ifndef QT_NO_SYSTEMLOCALE
2656 if (d->m_data == &systemLocaleData) {
2657 QVariant res = systemLocale()->query(format == LongFormat
2658 ? QSystemLocale::DateTimeFormatLong
2659 : QSystemLocale::DateTimeFormatShort,
2661 if (!res.isNull()) {
2662 return res.toString();
2666 return dateFormat(format) + u' ' + timeFormat(format);
2669#if QT_CONFIG(datestring)
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685QTime QLocale::toTime(
const QString &string, FormatType format)
const
2687 return toTime(string, timeFormat(format));
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715QDate QLocale::toDate(
const QString &string, FormatType format,
int baseYear)
const
2717 return toDate(string, dateFormat(format), baseYear);
2721
2722
2723
2724QDate QLocale::toDate(
const QString &string, FormatType format, QCalendar cal,
int baseYear)
const
2726 return toDate(string, dateFormat(format), cal, baseYear);
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748QDateTime QLocale::toDateTime(
const QString &string, FormatType format,
int baseYear)
const
2750 return toDateTime(string, dateTimeFormat(format), baseYear);
2754
2755
2756
2757QDateTime QLocale::toDateTime(
const QString &string, FormatType format, QCalendar cal,
2760 return toDateTime(string, dateTimeFormat(format), cal, baseYear);
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778QTime QLocale::toTime(
const QString &string,
const QString &format)
const
2781#if QT_CONFIG(datetimeparser)
2782 QDateTimeParser dt(QMetaType::QTime, QDateTimeParser::FromString, QCalendar());
2783 dt.setDefaultLocale(*
this);
2784 if (dt.parseFormat(format))
2785 dt.fromString(string,
nullptr, &time);
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818QDate QLocale::toDate(
const QString &string,
const QString &format,
int baseYear)
const
2820 return toDate(string, format, QCalendar(), baseYear);
2824
2825
2826
2827QDate QLocale::toDate(
const QString &string,
const QString &format, QCalendar cal,
int baseYear)
const
2830#if QT_CONFIG(datetimeparser)
2831 QDateTimeParser dt(QMetaType::QDate, QDateTimeParser::FromString, cal);
2832 dt.setDefaultLocale(*
this);
2833 if (dt.parseFormat(format))
2834 dt.fromString(string, &date,
nullptr, baseYear);
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867QDateTime QLocale::toDateTime(
const QString &string,
const QString &format,
int baseYear)
const
2869 return toDateTime(string, format, QCalendar(), baseYear);
2873
2874
2875
2876QDateTime QLocale::toDateTime(
const QString &string,
const QString &format, QCalendar cal,
2879#if QT_CONFIG(datetimeparser)
2882 QDateTimeParser dt(QMetaType::QDateTime, QDateTimeParser::FromString, cal);
2883 dt.setDefaultLocale(*
this);
2884 if (dt.parseFormat(format) && (dt.fromString(string, &datetime, baseYear)
2885 || !datetime.isValid())) {
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912QString QLocale::decimalPoint()
const
2914 return d->m_data->decimalPoint();
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931QString QLocale::groupSeparator()
const
2933 return d->m_data->groupSeparator();
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948QString QLocale::percent()
const
2950 return d->m_data->percentSign();
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967QString QLocale::zeroDigit()
const
2969 return d->m_data->zeroDigit();
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984QString QLocale::negativeSign()
const
2986 return d->m_data->negativeSign();
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001QString QLocale::positiveSign()
const
3003 return d->m_data->positiveSign();
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019QString QLocale::exponential()
const
3021 return d->m_data->exponentSeparator();
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3058QString QLocale::toString(
double f,
char format,
int precision)
const
3060 QLocaleData::DoubleForm form = QLocaleData::DFDecimal;
3061 uint flags = isAsciiUpper(format) ? QLocaleData::CapitalEorX : 0;
3063 switch (QtMiscUtils::toAsciiLower(format)) {
3065 form = QLocaleData::DFDecimal;
3068 form = QLocaleData::DFExponent;
3071 form = QLocaleData::DFSignificantDigits;
3077 if (!(d->m_numberOptions & OmitGroupSeparator))
3078 flags |= QLocaleData::GroupDigits;
3079 if (!(d->m_numberOptions & OmitLeadingZeroInExponent))
3080 flags |= QLocaleData::ZeroPadExponent;
3081 if (d->m_numberOptions & IncludeTrailingZeroesAfterDot)
3082 flags |= QLocaleData::AddTrailingZeroes;
3083 return d->m_data->doubleToString(f, precision, form, -1, flags);
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3119QLocale QLocale::system()
3121 constexpr auto sysData = []() {
3123#ifdef QT_NO_SYSTEMLOCALE
3126 return &systemLocaleData;
3129 Q_CONSTINIT
static QLocalePrivate locale(sysData(), -1, DefaultNumberOptions, 1);
3132 systemData(&locale.m_index);
3133 Q_ASSERT(locale.m_index >= 0 && locale.m_index < locale_data_size);
3134 locale.m_numberOptions = defaultNumberOptions(locale.m_data->m_language_id);
3136 return QLocale(locale);
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151QList<QLocale> QLocale::matchingLocales(Language language, Script script, Territory territory)
3153 const QLocaleId filter { language, script, territory };
3154 if (!filter.isValid())
3155 return QList<QLocale>();
3158 return QList<QLocale>{QLocale(C)};
3160 QList<QLocale> result;
3161 if (filter.matchesAll())
3162 result.reserve(locale_data_size);
3164 quint16 index = locale_index[language];
3166 while (filter.acceptLanguage(locale_data[index].m_language_id)) {
3167 const QLocaleId id = locale_data[index].id();
3168 if (filter.acceptScriptTerritory(id)) {
3169 result.append(QLocale(*(id.language_id == C ? c_private()
3170 :
new QLocalePrivate(locale_data + index, index))));
3176 const auto syslocaledata = systemData();
3178 if (filter.acceptLanguage(syslocaledata->m_language_id)) {
3179 const QLocaleId id = syslocaledata->id();
3180 if (filter.acceptScriptTerritory(id))
3181 result.append(system());
3187#if QT_DEPRECATED_SINCE(6
, 6
)
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198QList<QLocale::Country> QLocale::countriesForLanguage(Language language)
3200 const auto locales = matchingLocales(language, AnyScript, AnyCountry);
3201 QList<Country> result;
3202 result.reserve(locales.size());
3203 for (
const auto &locale : locales)
3204 result.append(locale.territory());
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221QString QLocale::monthName(
int month, FormatType type)
const
3223 return QCalendar().monthName(*
this, month, QCalendar::Unspecified, type);
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237QString QLocale::standaloneMonthName(
int month, FormatType type)
const
3239 return QCalendar().standaloneMonthName(*
this, month, QCalendar::Unspecified, type);
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255QString QLocale::dayName(
int day, FormatType type)
const
3257 return QCalendar().weekDayName(*
this, day, type);
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272QString QLocale::standaloneDayName(
int day, FormatType type)
const
3274 return QCalendar().standaloneWeekDayName(*
this, day, type);
3281 const QCalendarLocale *table)
3284 [[maybe_unused]]
const auto sameLocale = [](
const QLocaleData &locale,
3285 const QCalendarLocale &cal) {
3286 return locale.m_language_id == cal.m_language_id
3287 && locale.m_script_id == cal.m_script_id
3288 && locale.m_territory_id == cal.m_territory_id;
3290 const QCalendarLocale &monthly = table[loc->m_index];
3291#ifdef QT_NO_SYSTEMLOCALE
3292 [[maybe_unused]]
constexpr bool isSys =
false;
3294 [[maybe_unused]]
const bool isSys = loc->m_data == &systemLocaleData;
3299 Q_ASSERT(sameLocale(
locale_data[loc->m_index], monthly));
3304
3305
3308 const char16_t *monthsData,
int month,
3309 QLocale::FormatType type)
3313 case QLocale::LongFormat:
3314 range = localeData.longMonth();
3316 case QLocale::ShortFormat:
3317 range = localeData.shortMonth();
3319 case QLocale::NarrowFormat:
3320 range = localeData.narrowMonth();
3325 return range.getListEntry(monthsData, month - 1);
3329
3330
3333 const char16_t *monthsData,
int month,
3334 QLocale::FormatType type)
3338 case QLocale::LongFormat:
3339 range = localeData.longMonthStandalone();
3341 case QLocale::ShortFormat:
3342 range = localeData.shortMonthStandalone();
3344 case QLocale::NarrowFormat:
3345 range = localeData.narrowMonthStandalone();
3350 QString name = range.getListEntry(monthsData, month - 1);
3351 return name.isEmpty() ? rawMonthName(localeData, monthsData, month, type) : name;
3355
3356
3359 QLocale::FormatType type)
3363 case QLocale::LongFormat:
3364 range = data->longDayNames();
3366 case QLocale::ShortFormat:
3367 range = data->shortDayNames();
3369 case QLocale::NarrowFormat:
3370 range = data->narrowDayNames();
3375 return range.getListEntry(
days_data, day == 7 ? 0 : day);
3379
3380
3383 QLocale::FormatType type)
3387 case QLocale::LongFormat:
3388 range =data->longDayNamesStandalone();
3390 case QLocale::ShortFormat:
3391 range = data->shortDayNamesStandalone();
3393 case QLocale::NarrowFormat:
3394 range = data->narrowDayNamesStandalone();
3399 QString name = range.getListEntry(days_data, day == 7 ? 0 : day);
3401 return rawWeekDayName(data, day, type);
3407QString QCalendarBackend::monthName(
const QLocale &locale,
int month,
int,
3408 QLocale::FormatType format)
const
3410 Q_ASSERT(month >= 1 && month <= maximumMonthsInYear());
3411 return rawMonthName(getMonthDataFor(locale.d, localeMonthIndexData()),
3412 localeMonthData(), month, format);
3415QString QRomanCalendar::monthName(
const QLocale &locale,
int month,
int year,
3416 QLocale::FormatType format)
const
3418#ifndef QT_NO_SYSTEMLOCALE
3419 if (locale.d->m_data == &systemLocaleData) {
3420 Q_ASSERT(month >= 1 && month <= 12);
3421 QSystemLocale::QueryType queryType = QSystemLocale::MonthNameLong;
3423 case QLocale::LongFormat:
3424 queryType = QSystemLocale::MonthNameLong;
3426 case QLocale::ShortFormat:
3427 queryType = QSystemLocale::MonthNameShort;
3429 case QLocale::NarrowFormat:
3430 queryType = QSystemLocale::MonthNameNarrow;
3433 QVariant res = systemLocale()->query(queryType, month);
3435 return res.toString();
3439 return QCalendarBackend::monthName(locale, month, year, format);
3442QString QCalendarBackend::standaloneMonthName(
const QLocale &locale,
int month,
int,
3443 QLocale::FormatType format)
const
3445 Q_ASSERT(month >= 1 && month <= maximumMonthsInYear());
3446 return rawStandaloneMonthName(getMonthDataFor(locale.d, localeMonthIndexData()),
3447 localeMonthData(), month, format);
3450QString QRomanCalendar::standaloneMonthName(
const QLocale &locale,
int month,
int year,
3451 QLocale::FormatType format)
const
3453#ifndef QT_NO_SYSTEMLOCALE
3454 if (locale.d->m_data == &systemLocaleData) {
3455 Q_ASSERT(month >= 1 && month <= 12);
3456 QSystemLocale::QueryType queryType = QSystemLocale::StandaloneMonthNameLong;
3458 case QLocale::LongFormat:
3459 queryType = QSystemLocale::StandaloneMonthNameLong;
3461 case QLocale::ShortFormat:
3462 queryType = QSystemLocale::StandaloneMonthNameShort;
3464 case QLocale::NarrowFormat:
3465 queryType = QSystemLocale::StandaloneMonthNameNarrow;
3468 QVariant res = systemLocale()->query(queryType, month);
3470 return res.toString();
3474 return QCalendarBackend::standaloneMonthName(locale, month, year, format);
3479QString QCalendarBackend::weekDayName(
const QLocale &locale,
int day,
3480 QLocale::FormatType format)
const
3482 if (day < 1 || day > 7)
3485#ifndef QT_NO_SYSTEMLOCALE
3486 if (locale.d->m_data == &systemLocaleData) {
3487 QSystemLocale::QueryType queryType = QSystemLocale::DayNameLong;
3489 case QLocale::LongFormat:
3490 queryType = QSystemLocale::DayNameLong;
3492 case QLocale::ShortFormat:
3493 queryType = QSystemLocale::DayNameShort;
3495 case QLocale::NarrowFormat:
3496 queryType = QSystemLocale::DayNameNarrow;
3499 QVariant res = systemLocale()->query(queryType, day);
3501 return res.toString();
3505 return rawWeekDayName(locale.d->m_data, day, format);
3508QString QCalendarBackend::standaloneWeekDayName(
const QLocale &locale,
int day,
3509 QLocale::FormatType format)
const
3511 if (day < 1 || day > 7)
3514#ifndef QT_NO_SYSTEMLOCALE
3515 if (locale.d->m_data == &systemLocaleData) {
3516 QSystemLocale::QueryType queryType = QSystemLocale::StandaloneDayNameLong;
3518 case QLocale::LongFormat:
3519 queryType = QSystemLocale::StandaloneDayNameLong;
3521 case QLocale::ShortFormat:
3522 queryType = QSystemLocale::StandaloneDayNameShort;
3524 case QLocale::NarrowFormat:
3525 queryType = QSystemLocale::StandaloneDayNameNarrow;
3528 QVariant res = systemLocale()->query(queryType, day);
3530 return res.toString();
3534 return rawStandaloneWeekDayName(locale.d->m_data, day, format);
3540
3541
3542
3543
3544Qt::DayOfWeek QLocale::firstDayOfWeek()
const
3546#ifndef QT_NO_SYSTEMLOCALE
3547 if (d->m_data == &systemLocaleData) {
3548 const auto res = systemLocale()->query(QSystemLocale::FirstDayOfWeek);
3550 return static_cast<Qt::DayOfWeek>(res.toUInt());
3553 return static_cast<Qt::DayOfWeek>(d->m_data->m_first_day_of_week);
3559
3560
3561
3562
3563 struct TerritoryLanguage
3566 quint16 territoryId;
3567 QLocale::MeasurementSystem system;
3570 constexpr TerritoryLanguage ImperialMeasurementSystems[] = {
3571 { QLocale::English, QLocale::UnitedStates, QLocale::ImperialUSSystem },
3572 { QLocale::English, QLocale::UnitedStatesMinorOutlyingIslands, QLocale::ImperialUSSystem },
3573 { QLocale::Spanish, QLocale::UnitedStates, QLocale::ImperialUSSystem },
3574 { QLocale::Hawaiian, QLocale::UnitedStates, QLocale::ImperialUSSystem },
3575 { QLocale::English, QLocale::UnitedKingdom, QLocale::ImperialUKSystem }
3578 for (
const auto &system : ImperialMeasurementSystems) {
3579 if (system.languageId == m_data->m_language_id
3580 && system.territoryId == m_data->m_territory_id) {
3581 return system.system;
3584 return QLocale::MetricSystem;
3588
3589
3590
3591
3592QList<Qt::DayOfWeek> QLocale::weekdays()
const
3594#ifndef QT_NO_SYSTEMLOCALE
3595 if (d->m_data == &systemLocaleData) {
3597 = qvariant_cast<QList<Qt::DayOfWeek> >(systemLocale()->query(QSystemLocale::Weekdays));
3602 QList<Qt::DayOfWeek> weekdays;
3603 quint16 weekendStart = d->m_data->m_weekend_start;
3604 quint16 weekendEnd = d->m_data->m_weekend_end;
3605 for (
int day = Qt::Monday; day <= Qt::Sunday; day++) {
3606 if ((weekendEnd >= weekendStart && (day < weekendStart || day > weekendEnd)) ||
3607 (weekendEnd < weekendStart && (day > weekendEnd && day < weekendStart)))
3608 weekdays <<
static_cast<Qt::DayOfWeek>(day);
3614
3615
3616
3617
3618QLocale::MeasurementSystem QLocale::measurementSystem()
const
3620#ifndef QT_NO_SYSTEMLOCALE
3621 if (d->m_data == &systemLocaleData) {
3622 const auto res = systemLocale()->query(QSystemLocale::MeasurementSystem);
3624 return MeasurementSystem(res.toInt());
3628 return d->measurementSystem();
3632
3633
3634
3635
3636Qt::LayoutDirection QLocale::textDirection()
const
3645 case ImperialAramaicScript:
3646 case InscriptionalPahlaviScript:
3647 case InscriptionalParthianScript:
3648 case KharoshthiScript:
3650 case MandaeanScript:
3651 case ManichaeanScript:
3652 case MendeKikakuiScript:
3653 case MeroiticCursiveScript:
3654 case MeroiticScript:
3655 case NabataeanScript:
3657 case OldHungarianScript:
3658 case OldNorthArabianScript:
3659 case OldSouthArabianScript:
3661 case PalmyreneScript:
3662 case PhoenicianScript:
3663 case PsalterPahlaviScript:
3664 case SamaritanScript:
3667 return Qt::RightToLeft;
3671 return Qt::LeftToRight;
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689QString QLocale::toUpper(
const QString &str)
const
3691#if !defined(QT_BOOTSTRAPPED) && (QT_CONFIG(icu) || defined(Q_OS_WIN) || defined(Q_OS_APPLE))
3693 QString result = d->toUpper(str, &ok);
3698 return str.toUpper();
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713QString QLocale::toLower(
const QString &str)
const
3715#if !defined(QT_BOOTSTRAPPED) && (QT_CONFIG(icu) || defined(Q_OS_WIN) || defined(Q_OS_APPLE))
3717 const QString result = d->toLower(str, &ok);
3722 return str.toLower();
3727
3728
3729
3730
3731
3732
3733
3734QString QLocale::amText()
const
3736#ifndef QT_NO_SYSTEMLOCALE
3737 if (d->m_data == &systemLocaleData) {
3738 auto res = systemLocale()->query(QSystemLocale::AMText).toString();
3743 return d->m_data->anteMeridiem().getData(am_data);
3747
3748
3749
3750
3751
3752
3753
3754QString QLocale::pmText()
const
3756#ifndef QT_NO_SYSTEMLOCALE
3757 if (d->m_data == &systemLocaleData) {
3758 auto res = systemLocale()->query(QSystemLocale::PMText).toString();
3763 return d->m_data->postMeridiem().getData(pm_data);
3769 QStringView tail{text};
3771 if (tail.startsWith(
"UTC"_L1) || tail.startsWith(
"GMT"_L1))
3772 tail = tail.sliced(3);
3775 return (tail.isEmpty()
3780 : std::move(text).right(tail.size())));
3784#if QT_CONFIG(icu) || !(QT_CONFIG(timezone) && QT_CONFIG(timezone_locale))
3785namespace QtTimeZoneLocale {
3789QString zoneOffsetFormat([[maybe_unused]]
const QLocale &locale,
3791 [[maybe_unused]] QLocale::FormatType width,
3792 const QDateTime &when,
3796 Q_ASSERT(width == QLocale::ShortFormat);
3798#if QT_CONFIG(timezone)
3799 locale != QLocale::system()
3800 ? when.timeRepresentation().displayName(when, QTimeZone::OffsetName, locale)
3803 when.toOffsetFromUtc(offsetSeconds).timeZoneAbbreviation();
3805 if (!text.isEmpty())
3806 text = offsetFromAbbreviation(std::move(text));
3816QString QCalendarBackend::dateTimeToString(QStringView format,
const QDateTime &datetime,
3817 QDate dateOnly, QTime timeOnly,
3818 const QLocale &locale)
const
3822 bool formatDate =
false;
3823 bool formatTime =
false;
3824 if (datetime.isValid()) {
3825 date = datetime.date();
3826 time = datetime.time();
3829 }
else if (dateOnly.isValid()) {
3832 }
else if (timeOnly.isValid()) {
3840 int year = 0, month = 0, day = 0;
3842 const auto parts = julianDayToDate(date.toJulianDay());
3843 if (!parts.isValid())
3846 month = parts.month;
3850 auto appendToResult = [&](
int t,
int repeat) {
3851 auto data = locale.d->m_data;
3853 result.append(data->longLongToString(t, -1, 10, repeat, QLocaleData::ZeroPadded));
3855 result.append(data->longLongToString(t));
3858 auto formatType = [](
int repeat) {
3859 return repeat == 3 ? QLocale::ShortFormat : QLocale::LongFormat;
3863 while (i < format.size()) {
3864 if (format.at(i).unicode() ==
'\'') {
3865 result.append(qt_readEscapedFormatString(format, &i));
3869 const QChar c = format.at(i);
3870 qsizetype rep = qt_repeatCount(format.mid(i));
3871 Q_ASSERT(rep < std::numeric_limits<
int>::max());
3872 int repeat =
int(rep);
3875 switch (c.unicode()) {
3880 else if (repeat >= 2)
3885 appendToResult(year, (year < 0) ? 5 : 4);
3888 appendToResult(year % 100, 2);
3899 repeat = qMin(repeat, 4);
3901 appendToResult(month, repeat);
3903 result.append(monthName(locale, month, year, formatType(repeat)));
3908 repeat = qMin(repeat, 4);
3910 appendToResult(day, repeat);
3913 locale.dayName(dayOfWeek(date.toJulianDay()), formatType(repeat)));
3920 if (!used && formatTime) {
3921 switch (c.unicode()) {
3924 repeat = qMin(repeat, 2);
3925 int hour = time.hour();
3926 if (timeFormatContainsAP(format)) {
3932 appendToResult(hour, repeat);
3937 repeat = qMin(repeat, 2);
3938 appendToResult(time.hour(), repeat);
3943 repeat = qMin(repeat, 2);
3944 appendToResult(time.minute(), repeat);
3949 repeat = qMin(repeat, 2);
3950 appendToResult(time.second(), repeat);
3955 QString text = time.hour() < 12 ? locale.amText() : locale.pmText();
3958 if (format.mid(i + 1).startsWith(u'p', Qt::CaseInsensitive))
3960 if (c.unicode() ==
'A' && (repeat == 1 || format.at(i + 1).unicode() ==
'P'))
3961 text = std::move(text).toUpper();
3962 else if (c.unicode() ==
'a' && (repeat == 1 || format.at(i + 1).unicode() ==
'p'))
3963 text = std::move(text).toLower();
3965 result.append(text);
3971 repeat = qMin(repeat, 3);
3975 appendToResult(time.msec(), 3);
3977 if (result.endsWith(locale.zeroDigit()))
3979 if (result.endsWith(locale.zeroDigit()))
3985 enum AbbrType { Long, Offset, Short };
3986 const auto tzAbbr = [locale](
const QDateTime &when, AbbrType type) {
3988 if (type == Offset) {
3989 text = QtTimeZoneLocale::zoneOffsetFormat(locale, locale.d->m_index,
3990 QLocale::ShortFormat,
3991 when, when.offsetFromUtc());
3993 if (!text.isEmpty())
3996#if QT_CONFIG(timezone)
3997 if (type != Short || locale != QLocale::system()) {
3998 QTimeZone::NameType mode =
3999 type == Short ? QTimeZone::ShortName
4000 : type == Long ? QTimeZone::LongName : QTimeZone::OffsetName;
4001 text = when.timeRepresentation().displayName(when, mode, locale);
4002 if (!text.isEmpty())
4009 text = when.toOffsetFromUtc(when.offsetFromUtc()).timeZoneAbbreviation();
4011 text = when.timeZoneAbbreviation();
4012 return type == Offset ? offsetFromAbbreviation(std::move(text)) : text;
4016 repeat = qMin(repeat, 4);
4018 const QDateTime when = formatDate ? datetime : QDateTime::currentDateTime();
4022 text = tzAbbr(when, Long);
4026 text = tzAbbr(when, Offset);
4031 text = tzAbbr(when, Short);
4033 if (text.startsWith(
"UTC"_L1) && text.size() == 6)
4037 if (!text.isEmpty())
4038 result.append(text);
4047 result.resize(result.size() + repeat, c);
4057 int width,
unsigned flags)
const
4064 if (precision != QLocale::FloatingPointShortest && precision < 0)
4070 qsizetype bufSize = 1;
4071 if (precision == QLocale::FloatingPointShortest)
4072 bufSize += std::numeric_limits<
double>::max_digits10;
4073 else if (form == DFDecimal && qt_is_finite(d))
4074 bufSize += wholePartSpace(qAbs(d)) + precision;
4076 bufSize += qMax(2, precision) + 1;
4078 QVarLengthArray<
char> buf(bufSize);
4080 bool negative =
false;
4081 qt_doubleToAscii(d, form, precision, buf.data(), bufSize, negative, length, decpt);
4083 const QString prefix = signPrefix(negative && !qIsNull(d), flags);
4087 && (qstrncmp(buf.data(),
"inf", 3) == 0 || qstrncmp(buf.data(),
"nan", 3) == 0)) {
4088 numStr = QString::fromLatin1(buf.data(), length);
4090 const QString zero = zeroDigit();
4091 QString digits = QString::fromLatin1(buf.data(), length);
4095 Q_ASSERT(std::all_of(buf.cbegin(), buf.cbegin() + length, isAsciiDigit));
4097 }
else if (zero.size() == 2 && zero.at(0).isHighSurrogate()) {
4098 const char32_t zeroUcs4 = QChar::surrogateToUcs4(zero.at(0), zero.at(1));
4100 converted.reserve(2 * digits.size());
4101 for (QChar ch : std::as_const(digits)) {
4102 const char32_t digit = unicodeForDigit(ch.unicode() -
'0', zeroUcs4);
4103 Q_ASSERT(QChar::requiresSurrogates(digit));
4104 converted.append(QChar::highSurrogate(digit));
4105 converted.append(QChar::lowSurrogate(digit));
4109 Q_ASSERT(zero.size() == 1);
4110 Q_ASSERT(!zero.at(0).isSurrogate());
4111 char16_t z = zero.at(0).unicode();
4112 char16_t *
const value =
reinterpret_cast<
char16_t *>(digits.data());
4113 for (qsizetype i = 0; i < digits.size(); ++i)
4114 value[i] = unicodeForDigit(value[i] -
'0', z);
4117 const bool mustMarkDecimal = flags &
ForcePoint;
4122 numStr = exponentForm(
std::move(digits), decpt, precision, PMDecimalDigits,
4123 mustMarkDecimal, minExponentDigits);
4126 numStr = decimalForm(
std::move(digits), decpt, precision, PMDecimalDigits,
4127 mustMarkDecimal, groupDigits);
4134
4135
4136
4137
4138
4139
4140
4141
4143 if (precision == QLocale::FloatingPointShortest) {
4150 int bias = 2 + minExponentDigits;
4152 if (groupDigits && decpt >= grouping
.first + grouping
.least)
4155 if (decpt > 10 && minExponentDigits == 1)
4160 const qsizetype digitCount = digits.size() / zero.size();
4161 if (!mustMarkDecimal) {
4164 if (digitCount <= decpt && digitCount > 1)
4166 else if (digitCount == 1 && decpt <= 0)
4174 useDecimal = (decpt <= 0 ? 1 - decpt <= bias
4175 : decpt <= digitCount ? 0 <= bias : decpt <= digitCount + bias);
4178 Q_ASSERT(precision >= 0);
4179 useDecimal = decpt > -4 && decpt <= (precision ? precision : 1);
4183 ? decimalForm(
std::move(digits), decpt, precision, mode,
4184 mustMarkDecimal, groupDigits)
4185 : exponentForm(
std::move(digits), decpt, precision, mode,
4186 mustMarkDecimal, minExponentDigits);
4193 for (qsizetype i = numStr.size() / zero.size() + prefix.size(); i < width; ++i)
4194 numStr.prepend(zero);
4198 return prefix + (flags &
CapitalEorX ?
std::move(numStr).toUpper() : numStr);
4201QString
QLocaleData::decimalForm(QString &&digits,
int decpt,
int precision,
4202 PrecisionMode pm,
bool mustMarkDecimal,
4203 bool groupDigits)
const
4205 const QString zero = zeroDigit();
4206 const auto digitWidth = zero.size();
4207 Q_ASSERT(digitWidth == 1 || digitWidth == 2);
4208 Q_ASSERT(digits.size() % digitWidth == 0);
4213 for (; decpt < 0; ++decpt)
4214 digits.prepend(zero);
4216 for (qsizetype i = digits.size() / digitWidth; i < decpt; ++i)
4217 digits.append(zero);
4221 case PMDecimalDigits:
4222 for (qsizetype i = digits.size() / digitWidth - decpt; i < precision; ++i)
4223 digits.append(zero);
4225 case PMSignificantDigits:
4226 for (qsizetype i = digits.size() / digitWidth; i < precision; ++i)
4227 digits.append(zero);
4229 case PMChopTrailingZeros:
4230 Q_ASSERT(digits.size() / digitWidth <= qMax(decpt, 1) || !digits.endsWith(zero));
4234 if (mustMarkDecimal || decpt < digits.size() / digitWidth)
4235 digits.insert(decpt * digitWidth, decimalPoint());
4239 const QString group = groupSeparator();
4240 qsizetype i = decpt - grouping.least;
4241 if (i >= grouping.first) {
4242 digits.insert(i * digitWidth, group);
4243 while ((i -= grouping.higher) > 0)
4244 digits.insert(i * digitWidth, group);
4249 digits.prepend(zero);
4251 return std::move(digits);
4254QString
QLocaleData::exponentForm(QString &&digits,
int decpt,
int precision,
4255 PrecisionMode pm,
bool mustMarkDecimal,
4256 int minExponentDigits)
const
4258 const QString zero = zeroDigit();
4259 const auto digitWidth = zero.size();
4260 Q_ASSERT(digitWidth == 1 || digitWidth == 2);
4261 Q_ASSERT(digits.size() % digitWidth == 0);
4264 case PMDecimalDigits:
4265 for (qsizetype i = digits.size() / digitWidth; i < precision + 1; ++i)
4266 digits.append(zero);
4268 case PMSignificantDigits:
4269 for (qsizetype i = digits.size() / digitWidth; i < precision; ++i)
4270 digits.append(zero);
4272 case PMChopTrailingZeros:
4273 Q_ASSERT(digits.size() / digitWidth <= 1 || !digits.endsWith(zero));
4277 if (mustMarkDecimal || digits.size() > digitWidth)
4278 digits.insert(digitWidth, decimalPoint());
4280 digits.append(exponentSeparator());
4281 digits.append(longLongToString(decpt - 1, minExponentDigits, 10, -1, AlwaysShowSign));
4283 return std::move(digits);
4286QString
QLocaleData::signPrefix(
bool negative,
unsigned flags)
const
4289 return negativeSign();
4290 if (flags & AlwaysShowSign)
4291 return positiveSign();
4293 return QStringView(u" ").toString();
4298 int base,
int width,
unsigned flags)
const
4300 bool negative = n < 0;
4303
4304
4305
4306 QString numStr = qulltoa(negative ? 1u + qulonglong(-(n + 1)) : qulonglong(n),
4309 return applyIntegerFormatting(
std::move(numStr), negative, precision, base, width, flags);
4313 int base,
int width,
unsigned flags)
const
4315 const QString zero = zeroDigit();
4316 QString resultZero = base == 10 ? zero : QStringLiteral(
"0");
4317 return applyIntegerFormatting(l ? qulltoa(l, base, zero) : resultZero,
4318 false, precision, base, width, flags);
4321QString
QLocaleData::applyIntegerFormatting(QString &&numStr,
bool negative,
int precision,
4322 int base,
int width,
unsigned flags)
const
4324 const QString zero = base == 10 ? zeroDigit() : QStringLiteral(
"0");
4325 const auto digitWidth = zero.size();
4326 const auto digitCount = numStr.size() / digitWidth;
4328 const auto basePrefix = [&] () -> QStringView {
4329 if (flags & ShowBase) {
4330 const bool upper = flags & UppercaseBase;
4332 return upper ? u"0X" : u"0x";
4334 return upper ? u"0B" : u"0b";
4335 if (base == 8 && !numStr.startsWith(zero))
4341 const QString prefix = signPrefix(negative, flags) + basePrefix;
4343 qsizetype usedWidth = digitCount + prefix.size();
4347 const QString group = groupSeparator();
4348 qsizetype i = digitCount - grouping.least;
4349 if (i >= grouping.first) {
4350 numStr.insert(i * digitWidth, group);
4352 while ((i -= grouping.higher) > 0) {
4353 numStr.insert(i * digitWidth, group);
4360 const bool noPrecision = precision == -1;
4364 for (qsizetype i = numStr.size(); i < precision; ++i) {
4365 numStr.prepend(zero);
4372 for (qsizetype i = usedWidth; i < width; ++i)
4373 numStr.prepend(zero);
4376 QString result(flags & CapitalEorX ? std::move(numStr).toUpper() : std::move(numStr));
4378 result.prepend(prefix);
4399 result.exponentCyrillic = m_script_id == QLocale::CyrillicScript;
4401#ifndef QT_NO_SYSTEMLOCALE
4402 if (
this == &systemLocaleData) {
4403 const auto getString = [sys = systemLocale()](QSystemLocale::QueryType query) {
4404 return sys->query(query).toString();
4407 result.sysDecimal = getString(QSystemLocale::DecimalPoint);
4408 if (result.sysDecimal.size())
4409 result.decimal = QStringView{result.sysDecimal};
4411 result.sysGroup = getString(QSystemLocale::GroupSeparator);
4412 if (result.sysGroup.size())
4413 result.group = QStringView{result.sysGroup};
4414 result.sysMinus = getString(QSystemLocale::NegativeSign);
4415 if (result.sysMinus.size())
4416 result.minus = QStringView{result.sysMinus};
4417 result.sysPlus = getString(QSystemLocale::PositiveSign);
4418 if (result.sysPlus.size())
4419 result.plus = QStringView{result.sysPlus};
4420 result.setZero(getString(QSystemLocale::ZeroDigit));
4431class NumericTokenizer
4435 static constexpr char lettersInfNaN[] =
"afin";
4436 static constexpr auto matchInfNaN =
QtPrivate::makeCharacterSetMatch<lettersInfNaN>();
4437 const QStringView m_text;
4439 qsizetype m_index = 0;
4441 static_assert(
'+' + 1 ==
',' &&
',' + 1 ==
'-' &&
'-' + 1 ==
'.');
4446 : m_text(text), m_guide(guide), m_mode(mode),
4449 Q_ASSERT(m_guide.isValid(mode));
4451 bool done()
const {
return !(m_index < m_text.size()); }
4452 qsizetype index()
const {
return m_index; }
4453 inline int asBmpDigit(
char16_t digit)
const;
4457int NumericTokenizer::asBmpDigit(
char16_t digit)
const
4461 if (m_guide.zeroUcs != u'\u3007' || digit == m_guide.zeroUcs)
4462 return digit - m_guide.zeroUcs;
4465 if (digit == u'\u3020')
4468 return digit - u'\u3020';
4471char NumericTokenizer::nextToken()
4477 const auto asciiLower = [](
unsigned char c) {
return c >=
'A' ? c | 0x20 : c; };
4478 const QStringView tail = m_text.sliced(m_index);
4479 const QChar ch = tail.front();
4480 if (ch == u'\u2212') {
4488 if (Q_LIKELY(ch.unicode() < 256)) {
4489 unsigned char ascii = asciiLower(ch.toLatin1());
4490 if (Q_LIKELY(isAsciiDigit(ascii) || (
'+' <= ascii && ascii <= lastMark)
4494 && matchInfNaN.matches(ascii))
4496 && ascii ==
'e'))) {
4502 if (ch.unicode() < 256) {
4504 char ascii = asciiLower(ch.toLatin1());
4505 if (isAsciiDigit(ascii) || ascii ==
'-' || ascii ==
'+'
4514 if (tail.startsWith(m_guide.minus)) {
4515 m_index += m_guide.minus.size();
4518 if (tail.startsWith(m_guide.plus)) {
4519 m_index += m_guide.plus.size();
4522 if (!m_guide.group.isEmpty() && tail.startsWith(m_guide.group)) {
4523 m_index += m_guide.group.size();
4526 if (m_mode != QLocaleData::IntegerMode && tail.startsWith(m_guide.decimal)) {
4527 m_index += m_guide.decimal.size();
4530 if (m_mode == QLocaleData::DoubleScientificMode
4531 && tail.startsWith(m_guide.exponent, Qt::CaseInsensitive)) {
4532 m_index += m_guide.exponent.size();
4537 if (m_guide.zeroLen == 1) {
4538 if (!ch.isSurrogate()) {
4539 const uint gap = asBmpDigit(ch.unicode());
4544 }
else if (ch.isHighSurrogate() && tail.size() > 1 && tail.at(1).isLowSurrogate()) {
4547 }
else if (ch.isHighSurrogate()) {
4550 if (tail.size() > 1) {
4551 QChar low = tail.at(1);
4552 if (low.isLowSurrogate()) {
4554 const uint gap = QChar::surrogateToUcs4(ch, low) - m_guide.zeroUcs;
4555 return gap < 10u ?
'0' + gap : 0;
4563 Q_ASSERT(!(ch.isHighSurrogate() && tail.size() > 1 && tail.at(1).isLowSurrogate()));
4572 if ((m_guide.group == u"\u00a0" || m_guide.group == u"\u202f") && tail.startsWith(u' ')) {
4580 if (m_guide.exponentCyrillic
4581 && (tail.startsWith(u"\u0415", Qt::CaseInsensitive)
4582 || tail.startsWith(u"E", Qt::CaseInsensitive))) {
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4618 qsizetype digitsInGroup = 0;
4619 qsizetype last_separator_idx = -1;
4620 qsizetype start_of_digits_idx = -1;
4624 qsizetype decpt_idx = -1;
4625 qsizetype exponent_idx = -1;
4628 while (!tokens.done()) {
4629 qsizetype idx = tokens.index();
4630 char out = tokens.nextToken();
4633 Q_ASSERT(tokens.index() > idx);
4637 if (decpt_idx != -1 || exponent_idx != -1)
4640 }
else if (out ==
'e') {
4644 if (number_options.testFlag(QLocale::RejectLeadingZeroInExponent)
4645 && exponent_idx != -1 && out ==
'0') {
4649 if (!tokens.done() && !isAsciiDigit(last))
4653 if (number_options.testFlag(QLocale::RejectTrailingZeroesAfterDot) && decpt_idx >= 0) {
4655 if (idx == exponent_idx && last ==
'0')
4659 if (!number_options.testFlag(QLocale::RejectGroupSeparator)) {
4660 if (isAsciiDigit(out)) {
4661 if (start_of_digits_idx == -1)
4662 start_of_digits_idx = idx;
4664 }
else if (out ==
',') {
4666 if (decpt_idx != -1 || exponent_idx != -1)
4669 if (last_separator_idx == -1) {
4671 if (start_of_digits_idx == -1 || grouping.first > digitsInGroup
4672 || digitsInGroup >= grouping.least + grouping.first) {
4677 if (digitsInGroup != grouping.higher)
4681 last_separator_idx = idx;
4683 }
else if (mode != IntegerMode && (out ==
'.' || idx == exponent_idx)
4684 && last_separator_idx != -1) {
4686 if (digitsInGroup != grouping.least)
4690 last_separator_idx = -1;
4692 }
else if (out ==
',') {
4698 result->append(out);
4701 if (!number_options.testFlag(QLocale::RejectGroupSeparator) && last_separator_idx != -1) {
4703 if (digitsInGroup != grouping.least)
4707 if (number_options.testFlag(QLocale::RejectTrailingZeroesAfterDot)
4708 && decpt_idx != -1 && exponent_idx == -1) {
4714 result->append(
'\0');
4720 QLocale::NumberOptions number_options)
const
4723 result.buff.reserve(str.size());
4725 enum { Whole, Fractional, Exponent } state = Whole;
4727 NumericTokenizer tokens(str,
numericData(numMode
), numMode);
4730 while (!tokens.done()) {
4731 char c = tokens.nextToken();
4733 if (isAsciiDigit(c)) {
4740 if (decDigits-- == 0)
4744 if (!isAsciiDigit(last)) {
4747 if (c ==
'0' && (number_options & QLocale::RejectLeadingZeroInExponent))
4769 if (last !=
'\0' && !(scientific && last ==
'e'))
4775 if ((number_options & QLocale::RejectGroupSeparator) || state != Whole
4776 || !isAsciiDigit(last)) {
4785 if (!scientific || state == Exponent)
4795 Q_ASSERT(!c || c ==
'a' || c ==
'f' || c ==
'i' || c ==
'n');
4802 result.buff.append(c);
4809 if (last ==
',' || last ==
'-' || last ==
'+' || last ==
'e')
4816 QLocale::NumberOptions number_options)
const
4819 if (!numberToCLocale(str, number_options, DoubleScientificMode, &buff)) {
4824 auto r = qt_asciiToDouble(buff.constData(), buff.size() - 1);
4832 QLocale::NumberOptions number_options)
const
4835 if (!numberToCLocale(str, number_options, IntegerMode, &buff))
4838 return bytearrayToLongLong(QByteArrayView(buff), base);
4843 QLocale::NumberOptions number_options)
const
4846 if (!numberToCLocale(str, number_options, IntegerMode, &buff))
4849 return bytearrayToUnsLongLong(QByteArrayView(buff), base);
4857 const qsizetype len = num.size();
4858 if (used < len && num[used] !=
'\0') {
4859 while (used < len && ascii_isspace(num[used]))
4863 if (used < len && num[used] !=
'\0')
4870QSimpleParsedNumber<qint64>
QLocaleData::bytearrayToLongLong(QByteArrayView num,
int base)
4872 auto r = qstrntoll(num.data(), num.size(), base);
4873 if (!checkParsed(num, r.used))
4878QSimpleParsedNumber<quint64>
QLocaleData::bytearrayToUnsLongLong(QByteArrayView num,
int base)
4880 auto r = qstrntoull(num.data(), num.size(), base);
4881 if (!checkParsed(num, r.used))
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4899
4900
4901
4902QString QLocale::currencySymbol(CurrencySymbolFormat format)
const
4904#ifndef QT_NO_SYSTEMLOCALE
4905 if (d->m_data == &systemLocaleData) {
4906 auto res = systemLocale()->query(QSystemLocale::CurrencySymbol, format).toString();
4912 case CurrencySymbol:
4913 return d->m_data->currencySymbol().getData(currency_symbol_data);
4914 case CurrencyDisplayName:
4915 return d->m_data->currencyDisplayName().getData(currency_display_name_data);
4916 case CurrencyIsoCode: {
4917 const char *code = d->m_data->m_currency_iso_code;
4918 if (
auto len = qstrnlen(code, 3))
4919 return QString::fromLatin1(code, qsizetype(len));
4927
4928
4929
4930
4931
4932
4933
4934QString QLocale::toCurrencyString(qlonglong value,
const QString &symbol)
const
4936#ifndef QT_NO_SYSTEMLOCALE
4937 if (d->m_data == &systemLocaleData) {
4938 QSystemLocale::CurrencyToStringArgument arg(value, symbol);
4939 auto res = systemLocale()->query(QSystemLocale::CurrencyToString,
4940 QVariant::fromValue(arg)).toString();
4945 QLocaleData::DataRange range = d->m_data->currencyFormatNegative();
4946 if (!range.size || value >= 0)
4947 range = d->m_data->currencyFormat();
4950 QString str = toString(value);
4951 QString sym = symbol.isNull() ? currencySymbol() : symbol;
4953 sym = currencySymbol(CurrencyIsoCode);
4954 return range.viewData(currency_format_data).arg(str, sym);
4958
4959
4960
4961QString QLocale::toCurrencyString(qulonglong value,
const QString &symbol)
const
4963#ifndef QT_NO_SYSTEMLOCALE
4964 if (d->m_data == &systemLocaleData) {
4965 QSystemLocale::CurrencyToStringArgument arg(value, symbol);
4966 auto res = systemLocale()->query(QSystemLocale::CurrencyToString,
4967 QVariant::fromValue(arg)).toString();
4972 QString str = toString(value);
4973 QString sym = symbol.isNull() ? currencySymbol() : symbol;
4975 sym = currencySymbol(CurrencyIsoCode);
4976 return d->m_data->currencyFormat().getData(currency_format_data).arg(str, sym);
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989QString QLocale::toCurrencyString(
double value,
const QString &symbol,
int precision)
const
4991#ifndef QT_NO_SYSTEMLOCALE
4992 if (d->m_data == &systemLocaleData) {
4993 QSystemLocale::CurrencyToStringArgument arg(value, symbol);
4994 auto res = systemLocale()->query(QSystemLocale::CurrencyToString,
4995 QVariant::fromValue(arg)).toString();
5000 QLocaleData::DataRange range = d->m_data->currencyFormatNegative();
5001 if (!range.size || value >= 0)
5002 range = d->m_data->currencyFormat();
5005 QString str = toString(value,
'f', precision == -1 ? d->m_data->m_currency_digits : precision);
5006 QString sym = symbol.isNull() ? currencySymbol() : symbol;
5008 sym = currencySymbol(CurrencyIsoCode);
5009 return range.viewData(currency_format_data).arg(str, sym);
5013
5014
5015
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049QString QLocale::formattedDataSize(qint64 bytes,
int precision, DataSizeFormats format)
const
5051 int power, base = 1000;
5054 }
else if (format & DataSizeBase1000) {
5055 constexpr auto log10_1000 = 3;
5056 power =
int(std::log10(QtPrivate::qUnsignedAbs(bytes))) / log10_1000;
5058 constexpr auto log2_1024 = 10;
5059 power = QtPrivate::log2i(QtPrivate::qUnsignedAbs(bytes)) / log2_1024;
5063 const QString number = power
5064 ? toString(bytes / std::pow(
double(base), power),
'f', qMin(precision, 3 * power))
5069 Q_ASSERT(power <= 6 && power >= 0);
5072 QLocaleData::DataRange range = (format & DataSizeSIQuantifiers)
5073 ? d->m_data->byteAmountSI() : d->m_data->byteAmountIEC();
5074 unit = range.viewListEntry(byte_unit_data, power - 1);
5076 unit = d->m_data->byteCount().viewData(byte_unit_data);
5079 return number + u' ' + unit;
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124QStringList QLocale::uiLanguages(TagSeparator separator)
const
5126 const char sep =
char(separator);
5127 QStringList uiLanguages;
5128 if (uchar(sep) > 0x7f) {
5129 badSeparatorWarning(
"uiLanguages", sep);
5132 QList<QLocaleId> localeIds;
5133#ifdef QT_NO_SYSTEMLOCALE
5134 constexpr bool isSystem =
false;
5136 const bool isSystem = d->m_data == &systemLocaleData;
5138 uiLanguages = systemLocale()->query(QSystemLocale::UILanguages).toStringList();
5139 if (separator != TagSeparator::Dash) {
5141 const QChar join = QLatin1Char(sep);
5142 uiLanguages = uiLanguages.replaceInStrings(u"-", QStringView(&join, 1));
5146 for (
const auto &entry : std::as_const(uiLanguages))
5147 localeIds.append(QLocaleId::fromName(entry));
5148 if (localeIds.isEmpty())
5149 localeIds.append(systemLocale()->fallbackLocale().d->m_data->id());
5155 const QString name = QString::fromLatin1(d->m_data->id().name(sep));
5156 if (!name.isEmpty() && language() != C && !uiLanguages.contains(name)) {
5159 const QLocaleId id = d->m_data->id();
5160 const QLocaleId mine = id.withLikelySubtagsRemoved();
5161 const auto isMine = [mine](
const QString &entry) {
5162 return QLocaleId::fromName(entry).withLikelySubtagsRemoved() == mine;
5164 if (std::none_of(uiLanguages.constBegin(), uiLanguages.constEnd(), isMine)) {
5165 localeIds.prepend(id);
5166 uiLanguages.prepend(QString::fromLatin1(id.name(sep)));
5172 localeIds.append(d->m_data->id());
5175 for (qsizetype i = localeIds.size(); i-- > 0; ) {
5176 const QLocaleId id = localeIds.at(i);
5177 Q_ASSERT(id.language_id);
5178 if (id.language_id == C) {
5179 if (!uiLanguages.contains(u"C"_s))
5180 uiLanguages.append(u"C"_s);
5186 const QByteArray prior = id.name(sep);
5187 bool faithful =
true;
5188 if (isSystem && i < uiLanguages.size()) {
5190 faithful = uiLanguages.at(i) == QLatin1StringView(prior);
5193 || QLocaleId::fromName(uiLanguages.at(i)).name(sep) == prior);
5198 if (!uiLanguages.contains(QLatin1StringView(prior)))
5199 uiLanguages.append(QString::fromLatin1(prior));
5200 j = uiLanguages.size();
5203 const QLocaleId max = id.withLikelySubtagsAdded();
5204 Q_ASSERT(max.language_id);
5205 Q_ASSERT(max.language_id == id.language_id);
5209 const auto addIfEquivalent = [&j, &uiLanguages, max, sep, prior, faithful](QLocaleId cid) {
5210 if (cid.withLikelySubtagsAdded() == max) {
5211 if (
const QByteArray name = cid.name(sep); name != prior)
5212 uiLanguages.insert(j, QString::fromLatin1(name));
5218 addIfEquivalent({ max.language_id, 0, 0 });
5221 addIfEquivalent({ max.language_id, max.script_id, 0 });
5222 if (id.script_id && id.script_id != max.script_id)
5223 addIfEquivalent({ id.language_id, id.script_id, 0 });
5225 if (max.territory_id)
5226 addIfEquivalent({ max.language_id, 0, max.territory_id });
5227 if (id.territory_id && id.territory_id != max.territory_id)
5228 addIfEquivalent({ id.language_id, 0, id.territory_id });
5230 if (max.territory_id && max.script_id)
5231 addIfEquivalent(max);
5232 if (max.territory_id && id.script_id && id.script_id != max.script_id)
5233 addIfEquivalent({ id.language_id, id.script_id, max.territory_id });
5234 if (max.script_id && id.territory_id && id.territory_id != max.territory_id)
5235 addIfEquivalent({ id.language_id, max.script_id, id.territory_id });
5236 if (id.territory_id && id.territory_id != max.territory_id
5237 && id.script_id && id.script_id != max.script_id) {
5238 addIfEquivalent(id);
5243 QDuplicateTracker<QString> known(uiLanguages.size());
5244 for (qsizetype i = 0; i < uiLanguages.size();) {
5245 if (known.hasSeen(uiLanguages.at(i)))
5246 uiLanguages.remove(i);
5253 const QLatin1Char cut(sep);
5254 const auto hasPrefix = [cut](
auto name, QStringView stem) {
5256 return name.startsWith(stem)
5257 && (name.size() == stem.size() || name.at(stem.size()) == cut);
5268 qsizetype afterEquivs = 0;
5269 qsizetype afterTruncs = 0;
5273 for (qsizetype i = 0; i < uiLanguages.size(); ++i >= afterEquivs && (i = afterTruncs)) {
5274 const QString entry = uiLanguages.at(i);
5275 const QLocaleId max = QLocaleId::fromName(entry).withLikelySubtagsAdded();
5277 if (i >= afterEquivs) {
5278 Q_ASSERT(i >= afterTruncs);
5279 afterEquivs = i + 1;
5281 while (afterEquivs < uiLanguages.size()
5282 && QLocaleId::fromName(uiLanguages.at(afterEquivs))
5283 .withLikelySubtagsAdded() == max) {
5287 afterTruncs = afterEquivs;
5289 if (hasPrefix(entry, u"C") || hasPrefix(entry, u"und"))
5291 qsizetype stopAt = uiLanguages.size();
5292 QString prefix = entry;
5295
5296
5297
5298
5299
5300
5301
5302
5304 = QLocaleId::fromName(prefix).withLikelySubtagsAdded().script_id == max.script_id;
5305 while ((at = prefix.lastIndexOf(cut)) > 0) {
5306 prefix = prefix.first(at);
5310 bool found = known.contains(prefix);
5311 for (qsizetype j = afterTruncs; !found && j < stopAt; ++j) {
5312 QString later = uiLanguages.at(j);
5313 if (!later.startsWith(prefix)) {
5314 const QByteArray laterFull =
5315 QLocaleId::fromName(later.replace(cut, u'-')
5316 ).withLikelySubtagsAdded().name(sep);
5318 if (hasPrefix(QLatin1StringView(laterFull), prefix))
5323 Q_ASSERT(later.size() > prefix.size());
5324 if (later.at(prefix.size()) == cut) {
5331 QStringView head{later};
5332 for (qsizetype as = head.lastIndexOf(cut);
5333 !found && as > prefix.size(); as = head.lastIndexOf(cut)) {
5334 head = head.first(as);
5336 for (qsizetype k = j + 1; !seen && k < uiLanguages.size(); ++k)
5337 seen = uiLanguages.at(k) == head;
5346 (
void) known.hasSeen(prefix);
5348 uiLanguages.insert(afterTruncs++, prefix);
5351 uiLanguages.append(prefix);
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370QLocale QLocale::collation()
const
5372#ifndef QT_NO_SYSTEMLOCALE
5373 if (d->m_data == &systemLocaleData) {
5374 const auto res = systemLocale()->query(QSystemLocale::Collation).toString();
5376 return QLocale(res);
5383
5384
5385
5386
5387
5388
5389
5390QString QLocale::nativeLanguageName()
const
5392#ifndef QT_NO_SYSTEMLOCALE
5393 if (d->m_data == &systemLocaleData) {
5394 auto res = systemLocale()->query(QSystemLocale::NativeLanguageName).toString();
5399 return d->m_data->endonymLanguage().getData(endonyms_data);
5403
5404
5405
5406
5407
5408
5409
5410QString QLocale::nativeTerritoryName()
const
5412#ifndef QT_NO_SYSTEMLOCALE
5413 if (d->m_data == &systemLocaleData) {
5414 auto res = systemLocale()->query(QSystemLocale::NativeTerritoryName).toString();
5419 return d->m_data->endonymTerritory().getData(endonyms_data);
5422#if QT_DEPRECATED_SINCE(6
, 6
)
5424
5425
5426
5427
5428
5429
5430
5431
5432QString QLocale::nativeCountryName()
const
5434 return nativeTerritoryName();
5438#ifndef QT_NO_DEBUG_STREAM
5441 QDebugStateSaver saver(dbg);
5442 const bool isSys = l == QLocale::system();
5443 dbg.nospace().noquote()
5444 << (isSys ?
"QLocale::system()/* " :
"QLocale(")
5445 << QLocale::languageToString(l.language()) <<
", "
5446 << QLocale::scriptToString(l.script()) <<
", "
5447 << QLocale::territoryToString(l.territory()) << (isSys ?
" */" :
")");
5453#ifndef QT_NO_QOBJECT
5454#include "moc_qlocale.cpp"
const QLocaleData *const m_data
QLocale::MeasurementSystem measurementSystem() const
QByteArray bcp47Name(char separator='-') const
char32_t next(char32_t invalidAs=QChar::ReplacementCharacter)
Combined button and popup list for selecting options.
Q_GLOBAL_STATIC(DefaultRoleNames, qDefaultRoleNames, { { Qt::DisplayRole, "display" }, { Qt::DecorationRole, "decoration" }, { Qt::EditRole, "edit" }, { Qt::ToolTipRole, "toolTip" }, { Qt::StatusTipRole, "statusTip" }, { Qt::WhatsThisRole, "whatsThis" }, }) const QHash< int
static unsigned calculateFlags(int fieldWidth, char32_t fillChar, const QLocale &locale)
static QString calculateFiller(qsizetype padding, char32_t fillChar, qsizetype fieldWidth, const QLocaleData *localeData)
QDebug operator<<(QDebug dbg, const QLocale &l)
static QLocalePrivate * findLocalePrivate(QLocale::Language language, QLocale::Script script, QLocale::Territory territory)
static std::optional< QString > systemLocaleString(const QLocaleData *that, QSystemLocale::QueryType type)
static const QSystemLocale * systemLocale()
static bool checkParsed(QByteArrayView num, qsizetype used)
static QString rawWeekDayName(const QLocaleData *data, const int day, QLocale::FormatType type)
QDataStream & operator>>(QDataStream &ds, QLocale &l)
#define CheckCandidate(id)
static Q_DECL_COLD_FUNCTION void badSeparatorWarning(const char *method, char sep)
static QString rawStandaloneWeekDayName(const QLocaleData *data, const int day, QLocale::FormatType type)
static constexpr QLocale::NumberOptions defaultNumberOptions(QLocale::Language forLanguage)
static QStringView findTag(QStringView name) noexcept
static bool validTag(QStringView tag)
static qsizetype scriptIndex(QStringView code, Qt::CaseSensitivity cs) noexcept
static const QCalendarLocale & getMonthDataFor(const QLocalePrivate *loc, const QCalendarLocale *table)
static T toIntegral_helper(const QLocalePrivate *d, QStringView str, bool *ok)
static bool timeFormatContainsAP(QStringView format)
size_t qHash(const QLocale &key, size_t seed) noexcept
bool comparesEqual(const QLocale &loc, QLocale::Language lang)
static qsizetype findLocaleIndexById(QLocaleId localeId) noexcept
static constexpr qsizetype locale_data_size
static void updateSystemPrivate()
static QString rawMonthName(const QCalendarLocale &localeData, const char16_t *monthsData, int month, QLocale::FormatType type)
static qsizetype stringWidth(QStringView text)
static QLocalePrivate * c_private() noexcept
static const QLocaleData * defaultData()
static QString rawStandaloneMonthName(const QCalendarLocale &localeData, const char16_t *monthsData, int month, QLocale::FormatType type)
static QString localeString(const QLocaleData *that, QSystemLocale::QueryType type, QLocaleData::DataRange range)
static const QLocaleData * systemData(qsizetype *sysIndex=nullptr)
static QString offsetFromAbbreviation(QString &&text)
static qsizetype defaultIndex()
static constexpr char16_t single_character_data[]
static constexpr char16_t days_data[]
static constexpr QLocaleData locale_data[]
static constexpr QLocaleId likely_subtags[]
static constexpr unsigned char territory_code_list[]
static constexpr unsigned char script_code_list[]
bool qt_splitLocaleName(QStringView name, QStringView *lang=nullptr, QStringView *script=nullptr, QStringView *cntry=nullptr) noexcept
qsizetype qt_repeatCount(QStringView s) noexcept
QString qt_readEscapedFormatString(QStringView format, qsizetype *idx)
char32_t ucsFirst(const char16_t *table) const
QString positiveSign() const
QString groupSeparator() const
QSimpleParsedNumber< qint64 > stringToLongLong(QStringView str, int base, QLocale::NumberOptions options) const
QString zeroDigit() const
bool numberToCLocale(QStringView s, QLocale::NumberOptions number_options, NumberMode mode, CharBuff *result) const
QString decimalPoint() const
QString doubleToString(double d, int precision=-1, DoubleForm form=DFSignificantDigits, int width=-1, unsigned flags=NoFlags) const
QString listSeparator() const
QString percentSign() const
double stringToDouble(QStringView str, bool *ok, QLocale::NumberOptions options) const
QString longLongToString(qint64 l, int precision=-1, int base=10, int width=-1, unsigned flags=NoFlags) const
NumericData numericData(NumberMode mode) const
QString exponentSeparator() const
QString negativeSign() const
static const QLocaleData * c() noexcept
QSimpleParsedNumber< quint64 > stringToUnsLongLong(QStringView str, int base, QLocale::NumberOptions options) const
QString unsLongLongToString(quint64 l, int precision=-1, int base=10, int width=-1, unsigned flags=NoFlags) const
QLocaleId withLikelySubtagsAdded() const noexcept
Fill in blank fields of a locale ID.
QLocaleId withLikelySubtagsRemoved() const noexcept
bool operator==(QLocaleId other) const noexcept
bool matchesAll() const noexcept
QByteArray name(char separator='-') const