swift
Loading...
Searching...
No Matches
pqstring.cpp
1// SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors
2// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3
4#include "misc/pq/pqstring.h"
5
6#include <QLocale>
7#include <QRegularExpression>
8#include <QtDebug>
9
11#include "misc/pq/angle.h"
12#include "misc/pq/frequency.h"
13#include "misc/pq/length.h"
14#include "misc/pq/mass.h"
16#include "misc/pq/pressure.h"
17#include "misc/pq/speed.h"
18#include "misc/pq/temperature.h"
19#include "misc/pq/time.h"
20#include "misc/pq/units.h"
21
22SWIFT_DEFINE_VALUEOBJECT_MIXINS(swift::misc::physical_quantities, CPqString)
23
24namespace swift::misc::physical_quantities
25{
26 QString CPqString::convertToQString(bool ) const { return m_string; }
27
29 {
30 CVariant v;
31
32 // fine tuning of the string
33 const QString vs = value.trimmed().simplified();
34
35 // check
36 if (vs.isEmpty())
37 {
38 return v;
39 }
40
41 thread_local const QRegularExpression regex(R"(([-+]?[0-9]*[\.,]?[0-9]+)\s*(\D*)$)");
42 const auto match = regex.match(value);
43 if (!match.hasMatch())
44 {
45 return v;
46 } // not a valid number
47 QString unit = match.captured(2).trimmed();
48 const QString number = QString(value).replace(unit, "");
49 unit = unit.trimmed(); // trim after replace, not before
50
51 if (unit.isEmpty() || number.isEmpty())
52 {
53 return v;
54 }
55 bool success {};
56 const double numberD = parseNumber(number, success, mode);
57 if (!success)
58 {
59 return v;
60 }
61
63 {
65 return CVariant::fromValue(pq);
66 }
67
69 {
70 const CAngle pq(numberD, CMeasurementUnit::unitFromSymbol<CAngleUnit>(unit, false));
71 return CVariant::fromValue(pq);
72 }
73
75 {
77 return CVariant::fromValue(pq);
78 }
79
81 {
82 const CLength pq(numberD, CMeasurementUnit::unitFromSymbol<CLengthUnit>(unit, false));
83 return CVariant::fromValue(pq);
84 }
85
87 {
88 const CMass pq(numberD, CMeasurementUnit::unitFromSymbol<CMassUnit>(unit, false));
89 return CVariant::fromValue(pq);
90 }
91
93 {
94 const CPressure pq(numberD, CMeasurementUnit::unitFromSymbol<CPressureUnit>(unit, false));
95 return CVariant::fromValue(pq);
96 }
97
99 {
100 const CSpeed pq(numberD, CMeasurementUnit::unitFromSymbol<CSpeedUnit>(unit, false));
101 return CVariant::fromValue(pq);
102 }
103
105 {
106 const CTime pq(numberD, CMeasurementUnit::unitFromSymbol<CTimeUnit>(unit, false));
107 return CVariant::fromValue(pq);
108 }
109
111 {
113 return CVariant::fromValue(pq);
114 }
115 return v;
116 }
117
118 double CPqString::parseNumber(const QString &number, bool &success, CPqString::SeparatorMode mode)
119 {
120 double numberD = -1;
121 switch (mode)
122 {
123 case SeparatorLocale: numberD = QLocale::system().toDouble(number, &success); break;
124 case SeparatorQtDefault: numberD = number.toDouble(&success); break;
126 numberD = number.toDouble(&success);
127 if (!success)
128 {
129 numberD = QLocale::system().toDouble(number, &success);
130 }
131 break;
132 default: qFatal("Wrong mode"); break;
133 }
134 return numberD;
135 }
136} // namespace swift::misc::physical_quantities
Wrapper around QVariant which provides transparent access to CValueObject methods of the contained ob...
Definition variant.h:69
static CVariant fromValue(T &&value)
Construct a variant from a value.
Definition variant.h:139
Physical unit angle (radians, degrees).
Definition angle.h:23
Physical unit length (length).
Definition length.h:18
static bool isValidUnitSymbol(const QString &symbol)
Valid unit symbol?
static U unitFromSymbol(const QString &symbol, bool strict=true)
Unit from symbol.
static CVariant parseToVariant(const QString &value, SeparatorMode mode=SeparatorQtDefault)
Parse a string value like "100m", "10.3Mhz".
Definition pqstring.cpp:28
SeparatorMode
Number separators / group separators.
Definition pqstring.h:34
@ SeparatorLocale
depending on QLocale, e.g.
Definition pqstring.h:36
@ SeparatorQtDefault
100000.00 no group separator
Definition pqstring.h:35
QString convertToQString(bool i18n=false) const
Cast as QString.
Definition pqstring.cpp:26
static double parseNumber(const QString &number, bool &success, SeparatorMode mode=SeparatorBestGuess)
Locale aware parsing.
Definition pqstring.cpp:118
QLocale system()
double toDouble(QStringView s, bool *ok) const const
QRegularExpressionMatch match(QStringView subjectView, qsizetype offset, QRegularExpression::MatchType matchType, QRegularExpression::MatchOptions matchOptions) const const
bool isEmpty() const const
QString & replace(QChar before, QChar after, Qt::CaseSensitivity cs)
QString simplified() const const
double toDouble(bool *ok) const const
QString trimmed() const const
#define SWIFT_DEFINE_VALUEOBJECT_MIXINS(Namespace, Class)
Explicit template definition of mixins for a CValueObject subclass.
Definition valueobject.h:67