7 #include <QRegularExpression>
24 namespace swift::misc::physical_quantities
33 const QString vs = value.trimmed().simplified();
36 if (vs.isEmpty()) {
return v; }
38 thread_local
const QRegularExpression regex(
"([-+]?[0-9]*[\\.,]?[0-9]+)\\s*(\\D*)$");
39 const auto match = regex.match(value);
40 if (!match.hasMatch()) {
return v; }
41 QString unit = match.captured(2).trimmed();
42 const QString number = QString(value).replace(unit,
"");
43 unit = unit.trimmed();
45 if (unit.isEmpty() || number.isEmpty()) {
return v; }
47 const double numberD =
parseNumber(number, success, mode);
48 if (!success) {
return v; }
50 if (CMeasurementUnit::isValidUnitSymbol<CAccelerationUnit>(unit))
52 const CAcceleration pq(numberD, CMeasurementUnit::unitFromSymbol<CAccelerationUnit>(unit,
false));
56 if (CMeasurementUnit::isValidUnitSymbol<CAngleUnit>(unit))
58 const CAngle pq(numberD, CMeasurementUnit::unitFromSymbol<CAngleUnit>(unit,
false));
62 if (CMeasurementUnit::isValidUnitSymbol<CFrequencyUnit>(unit))
64 const CFrequency pq(numberD, CMeasurementUnit::unitFromSymbol<CFrequencyUnit>(unit,
false));
68 if (CMeasurementUnit::isValidUnitSymbol<CLengthUnit>(unit))
70 const CLength pq(numberD, CMeasurementUnit::unitFromSymbol<CLengthUnit>(unit,
false));
74 if (CMeasurementUnit::isValidUnitSymbol<CMassUnit>(unit))
76 const CMass pq(numberD, CMeasurementUnit::unitFromSymbol<CMassUnit>(unit,
false));
80 if (CMeasurementUnit::isValidUnitSymbol<CPressureUnit>(unit))
82 const CPressure pq(numberD, CMeasurementUnit::unitFromSymbol<CPressureUnit>(unit,
false));
86 if (CMeasurementUnit::isValidUnitSymbol<CSpeedUnit>(unit))
88 const CSpeed pq(numberD, CMeasurementUnit::unitFromSymbol<CSpeedUnit>(unit,
false));
92 if (CMeasurementUnit::isValidUnitSymbol<CTimeUnit>(unit))
94 const CTime pq(numberD, CMeasurementUnit::unitFromSymbol<CTimeUnit>(unit,
false));
98 if (CMeasurementUnit::isValidUnitSymbol<CTemperatureUnit>(unit))
100 const CTemperature pq(numberD, CMeasurementUnit::unitFromSymbol<CTemperatureUnit>(unit,
false));
111 case SeparatorLocale: numberD = QLocale::system().toDouble(number, &success);
break;
114 numberD = number.toDouble(&success);
115 if (!success) { numberD = QLocale::system().toDouble(number, &success); }
117 default: qFatal(
"Wrong mode");
break;
Wrapper around QVariant which provides transparent access to CValueObject methods of the contained ob...
static CVariant from(T &&value)
Synonym for fromValue().
Physical unit angle (radians, degrees)
Physical unit length (length)
static CVariant parseToVariant(const QString &value, SeparatorMode mode=SeparatorQtDefault)
Parse a string value like "100m", "10.3Mhz".
SeparatorMode
Number separators / group separators.
@ SeparatorLocale
depending on QLocale, e.g.
@ SeparatorBestGuess
try to figure out
@ SeparatorQtDefault
100000.00 no group separator
QString convertToQString(bool i18n=false) const
Cast as QString.
static double parseNumber(const QString &number, bool &success, SeparatorMode mode=SeparatorBestGuess)
Locale aware parsing.
Physical unit temperature.
#define SWIFT_DEFINE_VALUEOBJECT_MIXINS(Namespace, Class)
Explicit template definition of mixins for a CValueObject subclass.