# 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);
            }
        }

    });