| 'use strict'; |
| const UNITS = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; |
| |
| module.exports = num => { |
| if (!Number.isFinite(num)) { |
| throw new TypeError(`Expected a finite number, got ${typeof num}: ${num}`); |
| } |
| |
| const neg = num < 0; |
| |
| if (neg) { |
| num = -num; |
| } |
| |
| if (num < 1) { |
| return (neg ? '-' : '') + num + ' B'; |
| } |
| |
| const exponent = Math.min(Math.floor(Math.log(num) / Math.log(1000)), UNITS.length - 1); |
| const numStr = Number((num / Math.pow(1000, exponent)).toPrecision(3)); |
| const unit = UNITS[exponent]; |
| |
| return (neg ? '-' : '') + numStr + ' ' + unit; |
| }; |