| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 | /*! * bytes * Copyright(c) 2012-2014 TJ Holowaychuk * Copyright(c) 2015 Jed Watson * MIT Licensed */'use strict';/** * Module exports. * @public */module.exports = bytes;module.exports.format = format;module.exports.parse = parse;/** * Module variables. * @private */var formatThousandsRegExp = /\B(?=(\d{3})+(?!\d))/g;var formatDecimalsRegExp = /(?:\.0*|(\.[^0]+)0+)$/;var map = {  b:  1,  kb: 1 << 10,  mb: 1 << 20,  gb: 1 << 30,  tb: Math.pow(1024, 4),  pb: Math.pow(1024, 5),};var parseRegExp = /^((-|\+)?(\d+(?:\.\d+)?)) *(kb|mb|gb|tb|pb)$/i;/** * Convert the given value in bytes into a string or parse to string to an integer in bytes. * * @param {string|number} value * @param {{ *  case: [string], *  decimalPlaces: [number] *  fixedDecimals: [boolean] *  thousandsSeparator: [string] *  unitSeparator: [string] *  }} [options] bytes options. * * @returns {string|number|null} */function bytes(value, options) {  if (typeof value === 'string') {    return parse(value);  }  if (typeof value === 'number') {    return format(value, options);  }  return null;}/** * Format the given value in bytes into a string. * * If the value is negative, it is kept as such. If it is a float, * it is rounded. * * @param {number} value * @param {object} [options] * @param {number} [options.decimalPlaces=2] * @param {number} [options.fixedDecimals=false] * @param {string} [options.thousandsSeparator=] * @param {string} [options.unit=] * @param {string} [options.unitSeparator=] * * @returns {string|null} * @public */function format(value, options) {  if (!Number.isFinite(value)) {    return null;  }  var mag = Math.abs(value);  var thousandsSeparator = (options && options.thousandsSeparator) || '';  var unitSeparator = (options && options.unitSeparator) || '';  var decimalPlaces = (options && options.decimalPlaces !== undefined) ? options.decimalPlaces : 2;  var fixedDecimals = Boolean(options && options.fixedDecimals);  var unit = (options && options.unit) || '';  if (!unit || !map[unit.toLowerCase()]) {    if (mag >= map.pb) {      unit = 'PB';    } else if (mag >= map.tb) {      unit = 'TB';    } else if (mag >= map.gb) {      unit = 'GB';    } else if (mag >= map.mb) {      unit = 'MB';    } else if (mag >= map.kb) {      unit = 'KB';    } else {      unit = 'B';    }  }  var val = value / map[unit.toLowerCase()];  var str = val.toFixed(decimalPlaces);  if (!fixedDecimals) {    str = str.replace(formatDecimalsRegExp, '$1');  }  if (thousandsSeparator) {    str = str.split('.').map(function (s, i) {      return i === 0        ? s.replace(formatThousandsRegExp, thousandsSeparator)        : s    }).join('.');  }  return str + unitSeparator + unit;}/** * Parse the string value into an integer in bytes. * * If no unit is given, it is assumed the value is in bytes. * * @param {number|string} val * * @returns {number|null} * @public */function parse(val) {  if (typeof val === 'number' && !isNaN(val)) {    return val;  }  if (typeof val !== 'string') {    return null;  }  // Test if the string passed is valid  var results = parseRegExp.exec(val);  var floatValue;  var unit = 'b';  if (!results) {    // Nothing could be extracted from the given string    floatValue = parseInt(val, 10);    unit = 'b'  } else {    // Retrieve the value and the unit    floatValue = parseFloat(results[1]);    unit = results[4].toLowerCase();  }  if (isNaN(floatValue)) {    return null;  }  return Math.floor(map[unit] * floatValue);}
 |