datatype-number-debug.js revision 9a71d55c13f410382a33268d214e9110d0567a78
0N/AYUI.add('datatype-number', function(Y) {
1204N/A
0N/A/**
0N/A * The DataType utility provides a set of utility functions to operate on native
0N/A * JavaScript data types.
0N/A *
0N/A * @module datatype
0N/A */
0N/Avar LANG = Y.Lang,
0N/A
0N/A/**
0N/A * Number submodule.
0N/A *
0N/A * @class DataType.Number
0N/A * @static
0N/A */
0N/ANumber = {
0N/A
0N/A /**
0N/A * Converts data to type Number.
0N/A *
0N/A * @method parse
0N/A * @param data {String | Number | Boolean} Data to convert. Note, the following
0N/A * values return as null: null, undefined, NaN, "".
0N/A * @return {Number} A number, or null.
0N/A * @static
0N/A */
0N/A parse : function(data) {
0N/A if(!LANG.isValue(data) || (data === "")) {
0N/A return null;
0N/A }
0N/A
0N/A //Convert to number
0N/A var number = data * 1;
0N/A
0N/A // Validate
0N/A if(LANG.isNumber(number)) {
0N/A return number;
0N/A }
0N/A else {
0N/A Y.log("Could not convert data " + Y.dump(data) + " to type Number", "warn", this.toString());
0N/A return null;
0N/A }
0N/A },
0N/A
0N/A /**
0N/A * Takes a Number and formats to string for display to user.
0N/A *
0N/A * @method format
0N/A * @param data {Number} Number.
0N/A * @param config {Object} (Optional) Optional configuration values:
0N/A * <dl>
0N/A * <dt>prefix {String}</dd>
0N/A * <dd>String prepended before each number, like a currency designator "$"</dd>
0N/A * <dt>decimalPlaces {Number}</dd>
0N/A * <dd>Number of decimal places to round.</dd>
0N/A * <dt>decimalSeparator {String}</dd>
0N/A * <dd>Decimal separator</dd>
0N/A * <dt>thousandsSeparator {String}</dd>
0N/A * <dd>Thousands separator</dd>
0N/A * <dt>suffix {String}</dd>
0N/A * <dd>String appended after each number, like " items" (note the space)</dd>
0N/A * </dl>
0N/A * @return {String} Formatted number for display. Note, the following values
0N/A * return as "": null, undefined, NaN, "".
0N/A */
0N/A format : function(data, config) {
0N/A if(!LANG.isValue(data) || (data === "")) {
0N/A return "";
0N/A }
0N/A
0N/A config = config || {};
0N/A
0N/A if(!LANG.isNumber(data)) {
0N/A data *= 1;
0N/A }
0N/A
0N/A if(LANG.isNumber(data)) {
0N/A var isNeg = (data < 0);
0N/A var output = data + "";
0N/A var decSep = (config.decimalSeparator) ? config.decimalSeparator : ".";
0N/A var dotIndex;
0N/A
0N/A // Manage decimals
0N/A if(LANG.isNumber(config.decimalPlaces)) {
417N/A // Round to the correct decimal place
417N/A var decPlaces = config.decimalPlaces;
0N/A var dec = Math.pow(10, decPlaces);
417N/A output = Math.round(data*dec)/dec + "";
0N/A dotIndex = output.lastIndexOf(".");
417N/A
0N/A if(decPlaces > 0) {
0N/A // Add the decimal separator
0N/A if(dotIndex < 0) {
0N/A output += decSep;
0N/A dotIndex = output.length-1;
0N/A }
0N/A // Replace the "."
0N/A else if(decSep !== "."){
0N/A output = output.replace(".",decSep);
0N/A }
0N/A // Add missing zeros
0N/A while((output.length - 1 - dotIndex) < decPlaces) {
0N/A output += "0";
0N/A }
0N/A }
0N/A }
0N/A
0N/A // Add the thousands separator
1204N/A if(config.thousandsSeparator) {
1204N/A var thouSep = config.thousandsSeparator;
1204N/A dotIndex = output.lastIndexOf(decSep);
1204N/A dotIndex = (dotIndex > -1) ? dotIndex : output.length;
1204N/A var newOutput = output.substring(dotIndex);
0N/A var count = -1;
0N/A for (var i=dotIndex; i>0; i--) {
0N/A count++;
0N/A if ((count%3 === 0) && (i !== dotIndex) && (!isNeg || (i > 1))) {
0N/A newOutput = thouSep + newOutput;
0N/A }
0N/A newOutput = output.charAt(i-1) + newOutput;
0N/A }
0N/A output = newOutput;
0N/A }
0N/A
0N/A // Prepend prefix
0N/A output = (config.prefix) ? config.prefix + output : output;
0N/A
0N/A // Append suffix
0N/A output = (config.suffix) ? output + config.suffix : output;
0N/A
0N/A return output;
0N/A }
0N/A // Still not a Number, just return unaltered
0N/A else {
0N/A return data;
0N/A }
0N/A }
0N/A};
0N/A
0N/AY.namespace("DataType").Number = Number;
0N/A
0N/A
0N/A
0N/A}, '@VERSION@' ,{requires:['??']});
0N/A