Skip to content

Instantly share code, notes, and snippets.

@think49
Created March 6, 2011 05:06
Show Gist options
  • Save think49/857047 to your computer and use it in GitHub Desktop.
Save think49/857047 to your computer and use it in GitHub Desktop.
NumberString.js : 2-36の基数を持つ数値文字列オブジェクトを生成するコンストラクタ
/**
* NumberString.js
*
* @version 2.0.1
* @author think49
* @url https://gist.github.com/857047
*/
var NumberString;
NumberString = (function () {
/**
* When the NumberString constructror is called, return numerical character string with radix.
* @param {String} numberString Numerical character string.
* @param {Number} radix radix of numberString.
* @returns N base number string.
* @type String
*/
function NumberString (/*numberString, radix*/) {
var numberString, decimal, radix;
if (!(this instanceof NumberString)) {
if (arguments.length < 1) {
return new NumberString();
} else if (arguments.length < 2) {
return new NumberString(arguments[0]);
} else {
return new NumberString(arguments[0], arguments[1]);
}
}
numberString = arguments.length > 0 ? String(arguments[0]) : '';
radix = parseRadix(arguments[1]);
decimal = parseNumberString(numberString, radix);
this.valueOf = function valueOf () {
return numberString;
};
this.numberOf = function numberOf () {
return decimal;
};
numberString = this.toString(radix);
return this;
}
(function (_isNaN) {
/**
* Convert to N base number string.
* @param {Number} radix radix of returnValue.
* @returns N base number string.
* @type String
*/
this.toString = function toString (/*radix*/) {
if (arguments.length < 1) {
return String(this.valueOf());
}
if (this.isNaN()) {
return String(this.numberOf());
}
return Number.prototype.toString.call(this.numberOf(), arguments[0]).toUpperCase();
};
/**
* Returns true if this value to NaN, and otherwise returns false.
* @returns NaN flag.
* @type Boolean
*/
this.isNaN = function isNaN () {
return _isNaN(this.numberOf());
};
}).call(NumberString.prototype, isNaN);
/**
* Convert to an integral numeric value. (ES5: 9.4 ToInteger)
* @param {Number} number input argument.
* @returns integral numeric value.
* @type Number
*/
function toInteger (number) {
var _Infinity, _Math;
number = Number(number);
if (isNaN(number)) {
return 0;
}
_Infinity = 1/0;
if (number === 0 || number === _Infinity || number === -_Infinity) {
return number;
}
_Math = Math;
return _Math.floor(_Math.abs(number));
}
/**
* parse radix number.
* @param {Number} radix radix of number string.
* @returns parsed radix.
* @type Number
*/
function parseRadix (radix) {
radix = toInteger(radix);
return radix === 0 ? 10 : radix;
}
/**
* Convert from number string to decimal.
* @param {String} numberString number string.
* @param {Number} radix radix of number string (radix argument must be between 2 and 36).
* @returns decimal number.
* @type Number
*/
function parseNumberString (numberString/*, radix*/) {
var positiveNumber, max, decimal, charCode, i, j, _Number, _NaN, pow;
radix = parseRadix(arguments[1]);
if (radix % 1 !== 0 || radix < 2 || radix > 36) {
throw new RangeError('radix argument must be between 2 and 36');
}
_Number = Number;
if (radix === 10 || arguments.length < 1) {
return _Number(numberString);
}
numberString = String(numberString).toUpperCase();
numberString = numberString.trim ? numberString.trim() : numberString.replace(/^\s+|\s+$/g, '');
positiveNumber = 1;
if (numberString.charAt(0) === '-') {
positiveNumber = -1;
numberString = numberString.slice(1);
}
_NaN = 0/0;
pow = Math.pow;
decimal = 0;
i = numberString.length;
j = 0;
if (radix > 10) {
max = radix + 55;
while (i--) {
charCode = numberString.charCodeAt(i);
if (charCode > 47 && charCode < 58) { // [\u0030-\u0039] (0-9)
decimal += pow(radix, j) * (charCode - 48);
} else if (charCode > 64 && charCode < max) { // [\u0041-\u005A] (A-Z)
decimal += pow(radix, j) * (charCode - 55);
} else {
decimal = _NaN;
break;
}
++j;
}
} else {
while (i--) {
charCode = numberString.charCodeAt(i);
if (charCode > 47 && charCode < 58) { // [\u0030-\u0039] (0-9)
decimal += pow(radix, j) * (charCode - 48);
} else {
decimal = _NaN;
break;
}
++j;
}
}
return positiveNumber * decimal;
}
return NumberString;
})();
/**
* numberToString.js
*
* @version 1.0.0
* @author think49
* @url https://gist.github.com/857047
*/
/**
* Convert radix of decimal to N.
* @function
* @param {Number} decimal decimal number.
* @param {Number} radix of returnValue. radix must be between 2 and 36. (default value is 10).
* @returns N base number string.
* @type String
*/
function numberToString (decimal /*, radix*/) {
var radix, minus, numberString, remainder, _isNaN, _Number, floor, fromCharCode;
_isNaN = isNaN;
_Number = Number;
switch (arguments.length) {
case 0:
numberString = 'NaN';
break;
case 1:
numberString = _Number(decimal).toString();
break;
case 2:
default: // case "more than 2"
decimal = _Number(decimal);
if (_isNaN(decimal)) {
numberString = decimal.toString();
break;
}
radix = _Number(arguments[1]);
if (radix === 10 || radix === 0) {
numberString = decimal.toString();
break;
}
if (_isNaN(radix) || radix < 2 || radix > 36) {
throw new RangeError('radix argument must be between 2 and 36');
}
floor = Math.floor;
fromCharCode = String.fromCharCode;
minus = decimal < 0 ? '-' : '';
numberString = [];
do {
remainder = decimal % radix;
numberString.unshift(remainder > 9 ? fromCharCode(remainder + 55) : remainder);
decimal = floor(decimal / radix);
} while (decimal > 0);
numberString = minus + numberString.join('');
break;
}
return numberString;
}
@think49
Copy link
Author

think49 commented Mar 10, 2011

numberToString()Number.prototype.toString (ES5) の再発明です。
Number.prototype.toString を経由すれば済むことなので本来必要ありませんが、せっかく作ったので残しておきます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment