]> sigrok.org Git - pulseview.git/blobdiff - pv/util.cpp
Fixes
[pulseview.git] / pv / util.cpp
index 6424a9b1b5893b13d212ad1deef61221bea30aef..9a9a5065a2e17180eb6cdebb71b4aefc07fb5833 100644 (file)
@@ -138,8 +138,47 @@ QString format_time_si(const Timestamp& v, SIPrefix prefix,
        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 format_value_si(double v, SIPrefix prefix, unsigned precision,
+       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;
+                       }
+               }
+
+               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);
+       assert(prefix <= SIPrefix::yotta);
+
+       const double multiplier = pow(10.0, -exponent(prefix));
+
+       QString s;
+       QTextStream ts(&s);
+       if (sign && (v != 0))
+               ts << forcesign;
+       ts.setRealNumberNotation(QTextStream::FixedNotation);
+       ts.setRealNumberPrecision(precision);
+       ts << (v * multiplier) << ' ' << prefix << unit;
 
        return s;
 }