durationText function

String durationText(
  1. Duration dur, {
  2. DurationDisplayUnit? unit,
  3. bool includeUnit = true,
  4. int fractionDigits = 1,
  5. bool allowRoundingToZero = true,
})

Converts a Duration into a readable text representation in the specified unit.

includeUnit - whether to include the unit at the end of the returned value fractionDigits - how many fraction digits should appear after the decimal. This parameter value will be ignored when the unit is specified or inferred as DurationDisplayUnit.micros, since there cannot be a fractional value of microseconds from the Duration class. allowRoundingToZero - when true, this method may return zero for a very small number (e.g. '0.0 ms'). When false, this method will return a minimum value with the less than operator for very small values (e.g. '< 0.1 ms'). The value returned will always respect the specified fractionDigits.

Implementation

String durationText(
  final Duration dur, {
  DurationDisplayUnit? unit,
  final bool includeUnit = true,
  int fractionDigits = 1,
  final bool allowRoundingToZero = true,
}) {
  if (!allowRoundingToZero && unit == null) {
    throw AssertionError('To disable rounding to zero, please specify a unit.');
  }

  final micros = dur.inMicroseconds;
  unit ??= DurationDisplayUnit.unitFor(micros);
  double durationAsDouble;
  switch (unit) {
    case DurationDisplayUnit.micros:
      durationAsDouble = micros.toDouble();
    case DurationDisplayUnit.milliseconds:
      durationAsDouble = micros / 1000;
    case DurationDisplayUnit.seconds:
      durationAsDouble = micros / 1000000;
  }

  // Hide any fraction digits when the unit is microseconds, since the
  // duration displayed will always be a whole number in this case.
  if (unit == DurationDisplayUnit.micros) {
    fractionDigits = 0;
  }

  var durationStr = durationAsDouble.toStringAsFixed(fractionDigits);
  if (dur != Duration.zero && !allowRoundingToZero) {
    final zeroRegexp = RegExp('[0]+[.][0]+');
    if (zeroRegexp.hasMatch(durationStr)) {
      final buf = StringBuffer('< 0.');
      for (int i = 1; i < fractionDigits; i++) {
        buf.write('0');
      }
      buf.write('1');
      durationStr = buf.toString();
    }
  }
  return '$durationStr${includeUnit ? ' ${unit.display}' : ''}';
}