return stream << QString::fromStdString(str);
}
-QString format_time_si(const Timestamp& v, SIPrefix prefix,
- unsigned int precision, QString unit, bool sign)
+SIPrefix determine_value_prefix(double v)
{
- if (prefix == SIPrefix::unspecified) {
- // No prefix given, calculate it
-
- if (v.is_zero()) {
- prefix = SIPrefix::none;
- } else {
- int exp = exponent(SIPrefix::yotta);
- prefix = SIPrefix::yocto;
- while ((fabs(v) * pow(Timestamp(10), exp)) > 999 &&
- prefix < SIPrefix::yotta) {
- prefix = successor(prefix);
- exp -= 3;
- }
+ SIPrefix prefix;
+
+ if (v == 0) {
+ prefix = SIPrefix::none;
+ } else {
+ int exp = exponent(SIPrefix::yotta);
+ prefix = SIPrefix::yocto;
+ while ((fabs(v) * pow(10, exp)) > 999 &&
+ prefix < SIPrefix::yotta) {
+ prefix = successor(prefix);
+ exp -= 3;
}
}
+ return prefix;
+}
+
+QString format_time_si(const Timestamp& v, SIPrefix prefix,
+ unsigned int precision, QString unit, bool sign)
+{
+ if (prefix == SIPrefix::unspecified)
+ prefix = determine_value_prefix(v.convert_to<double>());
+
assert(prefix >= SIPrefix::yocto);
assert(prefix <= SIPrefix::yotta);
QTextStream ts(&s);
if (sign && !v.is_zero())
ts << forcesign;
- ts << qSetRealNumberPrecision(precision) << (v * multiplier) << ' '
- << prefix << unit;
+ ts << qSetRealNumberPrecision(precision) << (v * multiplier);
+ ts << ' ' << prefix << unit;
return s;
}
QString unit, bool sign)
{
if (prefix == SIPrefix::unspecified) {
- // No prefix given, calculate it
-
- if (v == 0) {
- prefix = SIPrefix::none;
- } else {
- int exp = exponent(SIPrefix::yotta);
- prefix = SIPrefix::yocto;
- while ((fabs(v) * pow(Timestamp(10), exp)) > 999 &&
- prefix < SIPrefix::yotta) {
- prefix = successor(prefix);
- exp -= 3;
- }
- }
+ prefix = determine_value_prefix(v);
+
+ const int prefix_order = -exponent(prefix);
+ precision = (prefix >= SIPrefix::none) ? max((int)(precision + prefix_order), 0) :
+ max((int)(precision - prefix_order), 0);
}
assert(prefix >= SIPrefix::yocto);