anybase
Version:
convert from and to numeric bases from base 2 to base 62
114 lines (104 loc) • 3.06 kB
JavaScript
// Generated by CoffeeScript 1.6.3
(function() {
var base_to_dec, char, chars, dec_to_base, i, map, _i, _j, _k, _len;
chars = (function() {
var _i, _results;
_results = [];
for (i = _i = 0; _i < 10; i = ++_i) {
_results.push(String(i));
}
return _results;
})();
for (i = _i = 65; _i <= 90; i = ++_i) {
chars.push(String.fromCharCode(i));
}
for (i = _j = 97; _j <= 122; i = ++_j) {
chars.push(String.fromCharCode(i));
}
map = {};
for (i = _k = 0, _len = chars.length; _k < _len; i = ++_k) {
char = chars[i];
map[char] = i;
}
base_to_dec = function(n, base) {
var n10, _l, _len1;
n10 = 0;
for (_l = 0, _len1 = n.length; _l < _len1; _l++) {
char = n[_l];
n10 = n10 * base + map[char];
}
return n10;
};
dec_to_base = function(n, base) {
var mod, nx;
nx = '';
while (n > 0) {
mod = n % base;
n = (n - mod) / base;
nx = chars[mod] + nx;
}
return nx;
};
module.exports = function(base, n, orig_base, digits_min, digits_max) {
var int_check, v, _l, _len1, _ref;
if (orig_base == null) {
orig_base = 10;
}
if (digits_min == null) {
digits_min = 0;
}
if (digits_max == null) {
digits_max = 0;
}
int_check = function(n, min, max) {
if (min == null) {
min = false;
}
if (max == null) {
max = false;
}
return !(isNaN(n) || Math.round(n) !== n || (min !== false && n < min) || (max !== false && n > max));
};
base = Number(base);
orig_base = Number(orig_base);
digits_min = Number(digits_min);
digits_max = Number(digits_max);
if (!int_check(base, 2, 62)) {
throw new Error('Invalid target numeric base specified: `' + base + '` (expected: 2 .. 62)');
}
if (!int_check(orig_base, 2, 62)) {
throw new Error('Invalid original numeric base specified: `' + orig_base + '` (expected: 2 .. 62)');
}
if (!int_check(digits_min, 0, 64)) {
throw new Error('Invalid minimum digits requested: `' + digits_min + '` (expected: 1 .. 64)');
}
if (!int_check(digits_max, 0, 64)) {
throw new Error('Invalid minimum digits requested: `' + digits_max + '` (expected: 1 .. 64)');
}
_ref = String(n);
for (_l = 0, _len1 = _ref.length; _l < _len1; _l++) {
char = _ref[_l];
if ((v = map[char]) > orig_base || (v == null)) {
throw new Error('Invalid digit(s) in number `' + n + '` for numeric ' + 'base `' + orig_base + '` (expected positive integer ' + 'composed of alphanumeric characters only)');
}
}
if (orig_base !== 10) {
n = base_to_dec(n, orig_base);
} else {
n = Number(n);
}
if (base !== 10) {
n = dec_to_base(n, base);
}
while (digits_min && String(n).length < digits_min) {
n = '0' + n;
}
if (digits_max && String(n).length > digits_max) {
n = String(n).substr(0, digits_max);
}
if (n === '') {
return '0';
}
return n;
};
}).call(this);