readableNumber function
Returns the specified number as a human-readable string.
precision
specifies the number of fractional digits to show after the
decimal point. precision
must be non-negative.
unit
, if specified, will be appended to the resulting string.
If binary
is true, readableNumber
will prefer binary IEC prefixes over
SI prefixes. binary
will be ignored for numbers with an absolute value
less than 1.
Examples:
readableNumber(1, unit: 'B'); // '1 B'
readableNumber(1000); // '1 K'
readableNumber(1234567, precision: 2, unit: 'B'); // '1.23 MB'
readableNumber(1234567, precision: 2, unit: 'B', binary: true); // '1.18 MiB'
readableNumber(0.1, unit: 'g'); // '100 mg'
Implementation
String readableNumber(
num n, {
int precision = 0,
String unit = '',
bool binary = false,
}) {
var absoluteValue = n.abs();
if (absoluteValue > 0 && absoluteValue < 1) {
return _readableMicroNumber(n, precision: precision, unit: unit);
}
var multiplier = binary ? 1024 : 1000;
var prefixes = binary ? _binaryMacroPrefixes : _siMacroPrefixes;
var space = ' ';
var i = 0;
while (true) {
if (n.abs() < multiplier) {
break;
}
i += 1;
if (i == prefixes.length) {
// Use the largest prefix we have.
i -= 1;
break;
}
n /= multiplier;
}
if (prefixes[i].isEmpty && unit.isEmpty) {
// Avoid a trailing space.
space = '';
}
return '${n.toStringAsFixed(precision)}$space${prefixes[i]}$unit';
}