Source: core/converter/bytes-converter.js

/**
 * @module montage/core/converter/bytes-converter
 * @requires montage/core/converter/converter
 * @requires montage/core/converter/number-converter
 */
var Converter = require("./converter").Converter;
var _numericValueToString = require("./number-converter")._numericValueToString;
var _stringToNumericValue = require("./number-converter").stringToNumericValue;
var NUMERIC_SCALES_BINARY_ = require("./number-converter").NUMERIC_SCALES_BINARY_;
var isDef = require("./converter").isDef;

var NUMERIC_SCALE_PREFIXES_BYTES = [
    'P', 'T', 'G', 'M', 'K', '', 'm', 'u', 'n'
];

/**
 * Converts a string to number of bytes, taking into account the units.
 * Binary conversion.
 * @function
 * @param {string} stringValue String to be converted to numeric value.
 * @returns {number} Numeric value for string.
 * @private
 */
var stringToNumBytes = function (stringValue) {
    return _stringToNumericValue(stringValue, NUMERIC_SCALES_BINARY_);
};

/**
 * Converts number of bytes to string representation. Binary conversion.
 * Default is to return the additional 'B' suffix, e.g. '10.5KB' to minimize
 * confusion with counts that are scaled by powers of 1000.
 * @function
 * @param {number} val Value to be converted.
 * @param {?number} decimals=2 The number of decimals to use.
 * Defaults to 2.
 * @param {?boolean} suffix=true If true, include trailing 'B' in returned
 * string. Default is true.
 * @returns {string} String representation of number of bytes.
 * @private
 */
var numBytesToString = function (val, optDecimals, optSuffix) {
    var suffix = '';
    if (!isDef(optSuffix) || optSuffix) {
        suffix = 'B';
    }
    return _numericValueToString(val, NUMERIC_SCALES_BINARY_, optDecimals, suffix, NUMERIC_SCALE_PREFIXES_BYTES);
};

/**
 * Formats a number of bytes in human readable form: 54, 450K, 1.3M, 5G etc.
 * @function
 * @param {number} bytes The number of bytes to show.
 * @param {number} decimals=2 The number of decimals to use.
 * Defaults to 2.
 * @returns {string} The human readable form of the byte size.
 * @private
 */
var fileSize = function (bytes, optDecimals) {
    return numBytesToString(bytes, optDecimals, false);
};

/**
 * @class BytesConverter
 * @classdesc Converts a numeric value to byte format (for example, 2048 is
 * converted to 2MB).
 * @extends Converter
 */
exports.BytesConverter = Converter.specialize( /** @lends BytesConverter# */ {

    /**
     * The number of decimals to include in the formatted value. Default is 2.
     * @type {Property}
     * @default {number} 2
     */
    decimals: {
        value: 2
    },

    /**
     * Converts the specified value to byte format.
     * @function
     * @param {Property} v The value to format.
     * @returns {string} The value converted to byte format.
     * @example
     * var Converter = require("./converter").Converter;
     * var BytesConverter = require("./converter").BytesConverter;
     * var bytes = "12341234";
     * var byteconverter = new BytesConverter();
     * console.log("Converted: " + byteconverter.convert(bytes));
     * console.log("Reverted: " + byteconverter.revert(bytes));
     * // Converted: 11.77MB
     * // Reverted: 12341234
     */
    convert: {
        value: function (v) {
            return fileSize(v, this.decimals);
        }
    },

    /**
     * Reverts a formatted byte string to a standard number.
     * @function
     * @param {string} v The value to revert.
     * @returns {string} v
     * @see BytesConverter#convert
     * @example
     * var Converter= require("./converter").Converter;
     * var BytesConverter = require("./converter").BytesConverter;
     * var bytes = "11.77MB";
     * var byteconverter = new BytesConverter();
     * console.log("Reverted: " + byteconverter.revert(bytes));
     * // Reverted: 12341234
     */
    revert: {
        value: function (v) {
            return stringToNumBytes(v);
        }
    }

});