Version 3.18.1
Show:

File: number/js/number-format.js

            /**
             * The Number Utility provides type-conversion and string-formatting
             * convenience methods for Numbers.
             *
             * @module datatype-number
             * @main datatype-number
             */
            
            /**
             * Format number submodule.
             *
             * @module datatype-number
             * @submodule datatype-number-format
             */
            
            /**
             * Number provides a set of utility functions to operate against Number objects.
             *
             * @class Number
             * @static
             */
            var LANG = Y.Lang;
            
            Y.mix(Y.namespace("Number"), {
                 /**
                 * Takes a Number and formats to string for display to user.
                 *
                 * @method format
                 * @param data {Number} Number.
                 * @param config {Object} (Optional) Optional configuration values:
                 *  <dl>
                 *   <dt>prefix {String}</dd>
                 *   <dd>String prepended before each number, like a currency designator "$"</dd>
                 *   <dt>decimalPlaces {Number}</dd>
                 *   <dd>Number of decimal places to round. Must be a number 0 to 20.</dd>
                 *   <dt>decimalSeparator {String}</dd>
                 *   <dd>Decimal separator</dd>
                 *   <dt>thousandsSeparator {String}</dd>
                 *   <dd>Thousands separator</dd>
                 *   <dt>suffix {String}</dd>
                 *   <dd>String appended after each number, like " items" (note the space)</dd>
                 *  </dl>
                 * @return {String} Formatted number for display. Note, the following values
                 * return as "": null, undefined, NaN, "".
                 */
                format: function(data, config) {
                    if(LANG.isNumber(data)) {
                        config = config || {};
            
                        var isNeg = (data < 0),
                            output = data + "",
                            decPlaces = config.decimalPlaces,
                            decSep = config.decimalSeparator || ".",
                            thouSep = config.thousandsSeparator,
                            decIndex,
                            newOutput, count, i;
            
                        // Decimal precision
                        if(LANG.isNumber(decPlaces) && (decPlaces >= 0) && (decPlaces <= 20)) {
                            // Round to the correct decimal place
                            output = data.toFixed(decPlaces);
                        }
            
                        // Decimal separator
                        if(decSep !== "."){
                            output = output.replace(".", decSep);
                        }
            
                        // Add the thousands separator
                        if(thouSep) {
                            // Find the dot or where it would be
                            decIndex = output.lastIndexOf(decSep);
                            decIndex = (decIndex > -1) ? decIndex : output.length;
                            // Start with the dot and everything to the right
                            newOutput = output.substring(decIndex);
                            // Working left, every third time add a separator, every time add a digit
                            for (count = 0, i=decIndex; i>0; i--) {
                                if ((count%3 === 0) && (i !== decIndex) && (!isNeg || (i > 1))) {
                                    newOutput = thouSep + newOutput;
                                }
                                newOutput = output.charAt(i-1) + newOutput;
                                count++;
                            }
                            output = newOutput;
                        }
            
                        // Prepend prefix
                        output = (config.prefix) ? config.prefix + output : output;
            
                        // Append suffix
                        output = (config.suffix) ? output + config.suffix : output;
            
                        return output;
                    }
                    // Not a Number, just return as string
                    else {
                        Y.log("Could not format data from type Number", "warn", "number");
                        return (LANG.isValue(data) && data.toString) ? data.toString() : "";
                    }
                }
            });
            
            Y.namespace("DataType");
            Y.DataType.Number = Y.Number;