sugar
Version:
A Javascript utility library for working with native objects.
49 lines (45 loc) • 1.46 kB
JavaScript
;
var commaSplit = require('../../common/internal/commaSplit'),
mathAliases = require('../../common/var/mathAliases'),
numberFormat = require('./numberFormat'),
withPrecision = require('../../common/internal/withPrecision');
var abs = mathAliases.abs,
pow = mathAliases.pow,
min = mathAliases.min,
max = mathAliases.max,
floor = mathAliases.floor;
function abbreviateNumber(num, precision, ustr, bytes) {
var fixed = num.toFixed(20),
decimalPlace = fixed.search(/\./),
numeralPlace = fixed.search(/[1-9]/),
significant = decimalPlace - numeralPlace,
units, unit, mid, i, divisor;
if (significant > 0) {
significant -= 1;
}
units = commaSplit(ustr);
if (units.length === 1) {
units = ustr.split('');
}
mid = units.indexOf('|');
if (mid === -1) {
// Skipping the placeholder means the units should start from zero,
// otherwise assume they end at zero.
mid = units[0] === '_' ? 0 : units.length;
}
i = max(min(floor(significant / 3), units.length - mid - 1), -mid);
unit = units[i + mid];
while (unit === '_') {
i += i < 0 ? -1 : 1;
unit = units[i + mid];
}
if (unit === '|') {
unit = '';
}
if (significant < -9) {
precision = abs(significant) - 9;
}
divisor = bytes ? pow(2, 10 * i) : pow(10, i * 3);
return numberFormat(withPrecision(num / divisor, precision || 0)) + unit;
}
module.exports = abbreviateNumber;