<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>The source code</title> <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" /> <script type="text/javascript" src="../resources/prettify/prettify.js"></script> <style type="text/css"> .highlight { display: block; background-color: #ddd; } </style> <script type="text/javascript"> function highlight() { document.getElementById(location.hash.replace(/#/, "")).className = "highlight"; } </script> </head> <body onload="prettyPrint(); highlight();"> <pre class="prettyprint lang-js"><span id='Ext-Number'>/** </span> * @class Ext.Number * * A collection of useful static methods to deal with numbers * @singleton */ Ext.Number = new function() { var me = this, isToFixedBroken = (0.9).toFixed() !== '1', math = Math; Ext.apply(this, { <span id='Ext-Number-method-constrain'> /** </span> * Checks whether or not the passed number is within a desired range. If the number is already within the * range it is returned, otherwise the min or max value is returned depending on which side of the range is * exceeded. Note that this method returns the constrained value but does not change the current number. * @param {Number} number The number to check * @param {Number} min The minimum number in the range * @param {Number} max The maximum number in the range * @return {Number} The constrained value if outside the range, otherwise the current value */ constrain: function(number, min, max) { var x = parseFloat(number); // Watch out for NaN in Chrome 18 // V8bug: http://code.google.com/p/v8/issues/detail?id=2056 // Operators are faster than Math.min/max. See http://jsperf.com/number-constrain // ... and (x < Nan) || (x < undefined) == false // ... same for (x > NaN) || (x > undefined) // so if min or max are undefined or NaN, we never return them... sadly, this // is not true of null (but even Math.max(-1,null)==0 and isNaN(null)==false) return (x < min) ? min : ((x > max) ? max : x); }, <span id='Ext-Number-method-snap'> /** </span> * Snaps the passed number between stopping points based upon a passed increment value. * * The difference between this and {@link #snapInRange} is that {@link #snapInRange} uses the minValue * when calculating snap points: * * r = Ext.Number.snap(56, 2, 55, 65); // Returns 56 - snap points are zero based * * r = Ext.Number.snapInRange(56, 2, 55, 65); // Returns 57 - snap points are based from minValue * * @param {Number} value The unsnapped value. * @param {Number} increment The increment by which the value must move. * @param {Number} minValue The minimum value to which the returned value must be constrained. Overrides the increment. * @param {Number} maxValue The maximum value to which the returned value must be constrained. Overrides the increment. * @return {Number} The value of the nearest snap target. */ snap : function(value, increment, minValue, maxValue) { var m; // If no value passed, or minValue was passed and value is less than minValue (anything < undefined is false) // Then use the minValue (or zero if the value was undefined) if (value === undefined || value < minValue) { return minValue || 0; } if (increment) { m = value % increment; if (m !== 0) { value -= m; if (m * 2 >= increment) { value += increment; } else if (m * 2 < -increment) { value -= increment; } } } return me.constrain(value, minValue, maxValue); }, <span id='Ext-Number-method-snapInRange'> /** </span> * Snaps the passed number between stopping points based upon a passed increment value. * * The difference between this and {@link #snap} is that {@link #snap} does not use the minValue * when calculating snap points: * * r = Ext.Number.snap(56, 2, 55, 65); // Returns 56 - snap points are zero based * * r = Ext.Number.snapInRange(56, 2, 55, 65); // Returns 57 - snap points are based from minValue * * @param {Number} value The unsnapped value. * @param {Number} increment The increment by which the value must move. * @param {Number} [minValue=0] The minimum value to which the returned value must be constrained. * @param {Number} [maxValue=Infinity] The maximum value to which the returned value must be constrained. * @return {Number} The value of the nearest snap target. */ snapInRange : function(value, increment, minValue, maxValue) { var tween; // default minValue to zero minValue = (minValue || 0); // If value is undefined, or less than minValue, use minValue if (value === undefined || value < minValue) { return minValue; } // Calculate how many snap points from the minValue the passed value is. if (increment && (tween = ((value - minValue) % increment))) { value -= tween; tween *= 2; if (tween >= increment) { value += increment; } } // If constraining within a maximum, ensure the maximum is on a snap point if (maxValue !== undefined) { if (value > (maxValue = me.snapInRange(maxValue, increment, minValue))) { value = maxValue; } } return value; }, <span id='Ext-Number-method-toFixed'> /** </span> * Formats a number using fixed-point notation * @param {Number} value The number to format * @param {Number} precision The number of digits to show after the decimal point */ toFixed: isToFixedBroken ? function(value, precision) { precision = precision || 0; var pow = math.pow(10, precision); return (math.round(value * pow) / pow).toFixed(precision); } : function(value, precision) { return value.toFixed(precision); }, <span id='Ext-Number-method-from'> /** </span> * Validate that a value is numeric and convert it to a number if necessary. Returns the specified default value if * it is not. Ext.Number.from('1.23', 1); // returns 1.23 Ext.Number.from('abc', 1); // returns 1 * @param {Object} value * @param {Number} defaultValue The value to return if the original value is non-numeric * @return {Number} value, if numeric, defaultValue otherwise */ from: function(value, defaultValue) { if (isFinite(value)) { value = parseFloat(value); } return !isNaN(value) ? value : defaultValue; }, <span id='Ext-Number-method-randomInt'> /** </span> * Returns a random integer between the specified range (inclusive) * @param {Number} from Lowest value to return. * @param {Number} to Highst value to return. * @return {Number} A random integer within the specified range. */ randomInt: function (from, to) { return math.floor(math.random() * (to - from + 1) + from); } }); <span id='Ext-method-num'> /** </span> * @deprecated 4.0.0 Please use {@link Ext.Number#from} instead. * @member Ext * @method num * @inheritdoc Ext.Number#from */ Ext.num = function() { return me.from.apply(this, arguments); }; };</pre> </body> </html>