datatype-number.js revision a117fec44ca101d02a635021dea473c2bd341fb5
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny DonnellyYUI.add('datatype-number-parse', function(Y) {
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnellyvar LANG = Y.Lang;
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly/**
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly * Parse number submodule.
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly *
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly * @module datatype
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly * @submodule datatype-number-parse
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly * @for DataType.Number
819e90d415ed17d59af3a247b2ad9d6feb0c21b5Luke Smith */
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny DonnellyY.mix(Y.namespace("DataType.Number"), {
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly /**
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly * Converts data to type Number.
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly *
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly * @method parse
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly * @param data {String | Number | Boolean} Data to convert. The following
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly * values return as null: null, undefined, NaN, "".
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly * @return {Number} A number, or null.
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly */
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly parse: function(data) {
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly var number = (data === null) ? data : +data;
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly if(LANG.isNumber(number)) {
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly return number;
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly }
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly else {
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly return null;
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly }
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly }
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly});
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly// Add Parsers shortcut
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny DonnellyY.namespace("Parsers").number = Y.DataType.Number.parse;
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly}, '@VERSION@' );
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly
YUI.add('datatype-number-format', function(Y) {
/**
* DataType.Number provides a set of utility functions to operate against Number objects.
*
* @class DataType.Number
* @static
*/
var LANG = Y.Lang;
/**
* Format number submodule.
*
* @module datatype
* @submodule datatype-number-format
*/
Y.mix(Y.namespace("DataType.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 {
return (LANG.isValue(data) && data.toString) ? data.toString() : "";
}
}
});
}, '@VERSION@' );
YUI.add('datatype-number', function(Y){}, '@VERSION@' ,{use:['datatype-number-parse', 'datatype-number-format']});