13#include <KLocalizedString>
15#include <QFontMetrics>
25#include "formatter_debug.h"
113 case UnitKiloByteRate:
115 case UnitMegaByteRate:
117 case UnitGigaByteRate:
119 case UnitTeraByteRate:
121 case UnitPetaByteRate:
126 case UnitKiloBitRate:
128 case UnitMegaBitRate:
130 case UnitGigaBitRate:
132 case UnitTeraBitRate:
134 case UnitPetaBitRate:
178 case UnitKiloWattHour:
180 case UnitMegaWattHour:
182 case UnitGigaWattHour:
184 case UnitTeraWattHour:
186 case UnitPetaWattHour:
204 case UnitDecibelMilliWatts:
220static int unitOrder(Unit unit)
230 case UnitKiloByteRate:
231 case UnitMegaByteRate:
232 case UnitGigaByteRate:
233 case UnitTeraByteRate:
234 case UnitPetaByteRate:
236 case UnitKiloBitRate:
237 case UnitMegaBitRate:
238 case UnitGigaBitRate:
239 case UnitTeraBitRate:
240 case UnitPetaBitRate:
258 case UnitKiloWattHour:
259 case UnitMegaWattHour:
260 case UnitGigaWattHour:
261 case UnitTeraWattHour:
262 case UnitPetaWattHour:
284static Unit unitBase(Unit unit)
296 case UnitKiloByteRate:
297 case UnitMegaByteRate:
298 case UnitGigaByteRate:
299 case UnitTeraByteRate:
300 case UnitPetaByteRate:
304 case UnitKiloBitRate:
305 case UnitMegaBitRate:
306 case UnitGigaBitRate:
307 case UnitTeraBitRate:
308 case UnitPetaBitRate:
336 case UnitKiloWattHour:
337 case UnitMegaWattHour:
338 case UnitGigaWattHour:
339 case UnitTeraWattHour:
340 case UnitPetaWattHour:
356static Unit adjustedUnit(qreal value, Unit unit, MetricPrefix prefix)
358 const int order = unitOrder(unit);
363 const Unit baseUnit = unitBase(unit);
364 const MetricPrefix basePrefix = MetricPrefix(unit - baseUnit);
366 if (prefix == MetricPrefixAutoAdjust) {
367 const qreal absoluteValue = value * std::pow(order,
int(basePrefix));
368 if (absoluteValue > 0) {
369 const int targetPrefix = std::log2(absoluteValue) / std::log2(order);
370 if (targetPrefix <= MetricPrefixLast) {
371 prefix = MetricPrefix(targetPrefix);
374 if (prefix == MetricPrefixAutoAdjust) {
379 const Unit newUnit = Unit(prefix + baseUnit);
382 if (unitBase(newUnit) != baseUnit) {
389static QString formatNumber(
const QVariant &value, Unit unit, MetricPrefix prefix, FormatOptions options)
393 if (!options.testFlag(FormatOptionShowNull) && (qFuzzyIsNull(amount) || qIsNaN(amount))) {
397 const Unit adjusted = adjustedUnit(amount, unit, prefix);
398 if (adjusted != unit) {
399 amount /= std::pow(unitOrder(unit), adjusted - unit);
415 auto seconds = value.
toLongLong() / sysconf(_SC_CLK_TCK);
423 clock_gettime(CLOCK_BOOTTIME, &tp);
425 clock_gettime(CLOCK_MONOTONIC, &tp);
430 const qreal secondsSinceSystemBoot = value.
toReal() / sysconf(_SC_CLK_TCK);
431 const QDateTime absoluteTimeSinceBoot = systemBootTime.
addSecs(secondsSinceSystemBoot);
438 const Unit adjusted = adjustedUnit(value.
toDouble(), unit, targetPrefix);
439 if (adjusted == unit) {
443 return std::pow(unitOrder(unit), adjusted - unit);
448 const Unit adjusted = adjustedUnit(value.
toDouble(), unit, targetPrefix);
449 return unitFormat(adjusted);
462 case UnitKiloByteRate:
463 case UnitMegaByteRate:
464 case UnitGigaByteRate:
465 case UnitTeraByteRate:
466 case UnitPetaByteRate:
468 case UnitKiloBitRate:
469 case UnitMegaBitRate:
470 case UnitGigaBitRate:
471 case UnitTeraBitRate:
472 case UnitPetaBitRate:
492 case UnitKiloWattHour:
493 case UnitMegaWattHour:
494 case UnitGigaWattHour:
495 case UnitTeraWattHour:
496 case UnitPetaWattHour:
508 case UnitDecibelMilliWatts:
509 return formatNumber(value, unit, targetPrefix, options);
511 case UnitBootTimestamp:
512 return formatBootTimestamp(value);
514 return formatTime(value);
516 return formatNumber(value, unit, MetricPrefix::MetricPrefixUnity, options);
518 return formatTicks(value);
530 return i18nc(
"Bytes unit symbol",
"B");
532 return i18nc(
"Kilobytes unit symbol",
"KiB");
534 return i18nc(
"Megabytes unit symbol",
"MiB");
536 return i18nc(
"Gigabytes unit symbol",
"GiB");
538 return i18nc(
"Terabytes unit symbol",
"TiB");
540 return i18nc(
"Petabytes unit symbol",
"PiB");
543 return i18nc(
"Bytes per second unit symbol",
"B/s");
544 case UnitKiloByteRate:
545 return i18nc(
"Kilobytes per second unit symbol",
"KiB/s");
546 case UnitMegaByteRate:
547 return i18nc(
"Megabytes per second unit symbol",
"MiB/s");
548 case UnitGigaByteRate:
549 return i18nc(
"Gigabytes per second unit symbol",
"GiB/s");
550 case UnitTeraByteRate:
551 return i18nc(
"Terabytes per second unit symbol",
"TiB/s");
552 case UnitPetaByteRate:
553 return i18nc(
"Petabytes per second unit symbol",
"PiB/s");
556 return i18nc(
"Bits per second unit symbol",
"bps");
557 case UnitKiloBitRate:
558 return i18nc(
"Kilobits per second unit symbol",
"Kbps");
559 case UnitMegaBitRate:
560 return i18nc(
"Megabits per second unit symbol",
"Mbps");
561 case UnitGigaBitRate:
562 return i18nc(
"Gigabits per second unit symbol",
"Gbps");
563 case UnitTeraBitRate:
564 return i18nc(
"Terabits per second unit symbol",
"Tbps");
565 case UnitPetaBitRate:
566 return i18nc(
"Petabits per second unit symbol",
"Pbps");
569 return i18nc(
"Hertz unit symbol",
"Hz");
571 return i18nc(
"Kilohertz unit symbol",
"kHz");
573 return i18nc(
"Megahertz unit symbol",
"MHz");
575 return i18nc(
"Gigahertz unit symbol",
"GHz");
577 return i18nc(
"Terahertz unit symbol",
"THz");
579 return i18nc(
"Petahertz unit symbol",
"PHz");
582 return i18nc(
"Volts unit symbol",
"V");
584 return i18nc(
"Kilovolts unit symbol",
"kV");
586 return i18nc(
"Megavolts unit symbol",
"MV");
588 return i18nc(
"Gigavolts unit symbol",
"GV");
590 return i18nc(
"Teravolts unit symbol",
"TV");
592 return i18nc(
"Petavolts unit symbol",
"PV");
595 return i18nc(
"Watts unit symbol",
"W");
597 return i18nc(
"Kilowatts unit symbol",
"kW");
599 return i18nc(
"Megawatts unit symbol",
"MW");
601 return i18nc(
"Gigawatts unit symbol",
"GW");
603 return i18nc(
"Terawatts unit symbol",
"TW");
605 return i18nc(
"Petawatts unit symbol",
"PW");
608 return i18nc(
"Watt-hours unit symbol",
"Wh");
609 case UnitKiloWattHour:
610 return i18nc(
"Kilo-watthours unit symbol",
"kWh");
611 case UnitMegaWattHour:
612 return i18nc(
"Mega-watthours unit symbol",
"MWh");
613 case UnitGigaWattHour:
614 return i18nc(
"Giga-watthours unit symbol",
"GWh");
615 case UnitTeraWattHour:
616 return i18nc(
"Tera-watthours unit symbol",
"TWh");
617 case UnitPetaWattHour:
618 return i18nc(
"Peta-watthours unit symbol",
"PWh");
621 return i18nc(
"Ampere unit symbol",
"A");
623 return i18nc(
"Kiloamperes unit symbol",
"kA");
625 return i18nc(
"Megaamperes unit symbol",
"MA");
627 return i18nc(
"Gigaamperes unit symbol",
"GA");
629 return i18nc(
"Teraamperes unit symbol",
"TA");
631 return i18nc(
"Petaamperes unit symbol",
"PA");
634 return i18nc(
"Percent unit",
"%");
636 return i18nc(
"Revolutions per minute unit symbol",
"RPM");
638 return i18nc(
"Celsius unit symbol",
"°C");
639 case UnitDecibelMilliWatts:
640 return i18nc(
"Decibels unit symbol",
"dBm");
642 return i18nc(
"Seconds unit symbol",
"s");
645 return i18nc(
"Rate unit symbol",
"s⁻¹");
654 auto order = unitOrder(unit);
657 switch (unitBase(unit)) {
659 maximum =
formatValue(order - 0.5, UnitMegaByte, MetricPrefixMega);
662 maximum =
formatValue(order - 0.5, UnitMegaByteRate, MetricPrefixMega);
665 maximum =
formatValue(order - 0.5, UnitMegaBitRate, MetricPrefixMega);
668 maximum =
formatValue(order - 0.5, UnitMegaHertz, MetricPrefixMega);
678 return metrics.horizontalAdvance(maximum);
KLocalizedString subs(const KLocalizedString &a, int fieldWidth=0, QChar fillChar=QLatin1Char(' ')) const
QString i18nc(const char *context, const char *text, const TYPE &arg...)
KLocalizedString KI18N_EXPORT ki18nc(const char *context, const char *text)
QDateTime addSecs(qint64 s) const const
QDateTime currentDateTime()
QString toString(QDate date, FormatType format) const const
double toDouble(bool *ok) const const
qlonglong toLongLong(bool *ok) const const
qreal toReal(bool *ok) const const
QString toString() const const