@acrool/js-utils
Version:
Common javascript utils methods for project development
299 lines (298 loc) • 10.6 kB
JavaScript
var k = 20, O = 1, D = 1e6, _ = 1e6, F = -7, L = 21, U = !1, M = "[big.js] ", p = M + "Invalid ", P = p + "decimal places", V = p + "rounding mode", j = M + "Division by zero", h = {}, w = void 0, C = /^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i;
function q() {
function r(e) {
var t = this;
if (!(t instanceof r))
return e === w && arguments.length === 0 ? q() : new r(e);
if (e instanceof r)
t.s = e.s, t.e = e.e, t.c = e.c.slice();
else {
if (typeof e != "string") {
if (r.strict === !0 && typeof e != "bigint")
throw TypeError(p + "value");
e = e === 0 && 1 / e < 0 ? "-0" : String(e);
}
T(t, e);
}
t.constructor = r;
}
return r.prototype = h, r.DP = k, r.RM = O, r.NE = F, r.PE = L, r.strict = U, r.roundDown = 0, r.roundHalfUp = 1, r.roundHalfEven = 2, r.roundUp = 3, r;
}
function T(r, e) {
var t, i, n;
if (!C.test(e))
throw Error(p + "number");
for (r.s = e.charAt(0) == "-" ? (e = e.slice(1), -1) : 1, (t = e.indexOf(".")) > -1 && (e = e.replace(".", "")), (i = e.search(/e/i)) > 0 ? (t < 0 && (t = i), t += +e.slice(i + 1), e = e.substring(0, i)) : t < 0 && (t = e.length), n = e.length, i = 0; i < n && e.charAt(i) == "0"; ) ++i;
if (i == n)
r.c = [r.e = 0];
else {
for (; n > 0 && e.charAt(--n) == "0"; ) ;
for (r.e = t - i - 1, r.c = [], t = 0; i <= n; ) r.c[t++] = +e.charAt(i++);
}
return r;
}
function x(r, e, t, i) {
var n = r.c;
if (t === w && (t = r.constructor.RM), t !== 0 && t !== 1 && t !== 2 && t !== 3)
throw Error(V);
if (e < 1)
i = t === 3 && (i || !!n[0]) || e === 0 && (t === 1 && n[0] >= 5 || t === 2 && (n[0] > 5 || n[0] === 5 && (i || n[1] !== w))), n.length = 1, i ? (r.e = r.e - e + 1, n[0] = 1) : n[0] = r.e = 0;
else if (e < n.length) {
if (i = t === 1 && n[e] >= 5 || t === 2 && (n[e] > 5 || n[e] === 5 && (i || n[e + 1] !== w || n[e - 1] & 1)) || t === 3 && (i || !!n[0]), n.length = e, i) {
for (; ++n[--e] > 9; )
if (n[e] = 0, e === 0) {
++r.e, n.unshift(1);
break;
}
}
for (e = n.length; !n[--e]; ) n.pop();
}
return r;
}
function N(r, e, t) {
var i = r.e, n = r.c.join(""), c = n.length;
if (e)
n = n.charAt(0) + (c > 1 ? "." + n.slice(1) : "") + (i < 0 ? "e" : "e+") + i;
else if (i < 0) {
for (; ++i; ) n = "0" + n;
n = "0." + n;
} else if (i > 0)
if (++i > c)
for (i -= c; i--; ) n += "0";
else i < c && (n = n.slice(0, i) + "." + n.slice(i));
else c > 1 && (n = n.charAt(0) + "." + n.slice(1));
return r.s < 0 && t ? "-" + n : n;
}
h.abs = function() {
var r = new this.constructor(this);
return r.s = 1, r;
};
h.cmp = function(r) {
var e, t = this, i = t.c, n = (r = new t.constructor(r)).c, c = t.s, u = r.s, o = t.e, s = r.e;
if (!i[0] || !n[0]) return i[0] ? c : n[0] ? -u : 0;
if (c != u) return c;
if (e = c < 0, o != s) return o > s ^ e ? 1 : -1;
for (u = (o = i.length) < (s = n.length) ? o : s, c = -1; ++c < u; )
if (i[c] != n[c]) return i[c] > n[c] ^ e ? 1 : -1;
return o == s ? 0 : o > s ^ e ? 1 : -1;
};
h.div = function(r) {
var e = this, t = e.constructor, i = e.c, n = (r = new t(r)).c, c = e.s == r.s ? 1 : -1, u = t.DP;
if (u !== ~~u || u < 0 || u > D)
throw Error(P);
if (!n[0])
throw Error(j);
if (!i[0])
return r.s = c, r.c = [r.e = 0], r;
var o, s, f, v, l, E = n.slice(), B = o = n.length, S = i.length, a = i.slice(0, o), g = a.length, b = r, I = b.c = [], A = 0, m = u + (b.e = e.e - r.e) + 1;
for (b.s = c, c = m < 0 ? 0 : m, E.unshift(0); g++ < o; ) a.push(0);
do {
for (f = 0; f < 10; f++) {
if (o != (g = a.length))
v = o > g ? 1 : -1;
else
for (l = -1, v = 0; ++l < o; )
if (n[l] != a[l]) {
v = n[l] > a[l] ? 1 : -1;
break;
}
if (v < 0) {
for (s = g == o ? n : E; g; ) {
if (a[--g] < s[g]) {
for (l = g; l && !a[--l]; ) a[l] = 9;
--a[l], a[g] += 10;
}
a[g] -= s[g];
}
for (; !a[0]; ) a.shift();
} else
break;
}
I[A++] = v ? f : ++f, a[0] && v ? a[g] = i[B] || 0 : a = [i[B]];
} while ((B++ < S || a[0] !== w) && c--);
return !I[0] && A != 1 && (I.shift(), b.e--, m--), A > m && x(b, m, t.RM, a[0] !== w), b;
};
h.eq = function(r) {
return this.cmp(r) === 0;
};
h.gt = function(r) {
return this.cmp(r) > 0;
};
h.gte = function(r) {
return this.cmp(r) > -1;
};
h.lt = function(r) {
return this.cmp(r) < 0;
};
h.lte = function(r) {
return this.cmp(r) < 1;
};
h.minus = h.sub = function(r) {
var e, t, i, n, c = this, u = c.constructor, o = c.s, s = (r = new u(r)).s;
if (o != s)
return r.s = -s, c.plus(r);
var f = c.c.slice(), v = c.e, l = r.c, E = r.e;
if (!f[0] || !l[0])
return l[0] ? r.s = -s : f[0] ? r = new u(c) : r.s = 1, r;
if (o = v - E) {
for ((n = o < 0) ? (o = -o, i = f) : (E = v, i = l), i.reverse(), s = o; s--; ) i.push(0);
i.reverse();
} else
for (t = ((n = f.length < l.length) ? f : l).length, o = s = 0; s < t; s++)
if (f[s] != l[s]) {
n = f[s] < l[s];
break;
}
if (n && (i = f, f = l, l = i, r.s = -r.s), (s = (t = l.length) - (e = f.length)) > 0) for (; s--; ) f[e++] = 0;
for (s = e; t > o; ) {
if (f[--t] < l[t]) {
for (e = t; e && !f[--e]; ) f[e] = 9;
--f[e], f[t] += 10;
}
f[t] -= l[t];
}
for (; f[--s] === 0; ) f.pop();
for (; f[0] === 0; )
f.shift(), --E;
return f[0] || (r.s = 1, f = [E = 0]), r.c = f, r.e = E, r;
};
h.mod = function(r) {
var e, t = this, i = t.constructor, n = t.s, c = (r = new i(r)).s;
if (!r.c[0])
throw Error(j);
return t.s = r.s = 1, e = r.cmp(t) == 1, t.s = n, r.s = c, e ? new i(t) : (n = i.DP, c = i.RM, i.DP = i.RM = 0, t = t.div(r), i.DP = n, i.RM = c, this.minus(t.times(r)));
};
h.neg = function() {
var r = new this.constructor(this);
return r.s = -r.s, r;
};
h.plus = h.add = function(r) {
var e, t, i, n = this, c = n.constructor;
if (r = new c(r), n.s != r.s)
return r.s = -r.s, n.minus(r);
var u = n.e, o = n.c, s = r.e, f = r.c;
if (!o[0] || !f[0])
return f[0] || (o[0] ? r = new c(n) : r.s = n.s), r;
if (o = o.slice(), e = u - s) {
for (e > 0 ? (s = u, i = f) : (e = -e, i = o), i.reverse(); e--; ) i.push(0);
i.reverse();
}
for (o.length - f.length < 0 && (i = f, f = o, o = i), e = f.length, t = 0; e; o[e] %= 10) t = (o[--e] = o[e] + f[e] + t) / 10 | 0;
for (t && (o.unshift(t), ++s), e = o.length; o[--e] === 0; ) o.pop();
return r.c = o, r.e = s, r;
};
h.pow = function(r) {
var e = this, t = new e.constructor("1"), i = t, n = r < 0;
if (r !== ~~r || r < -1e6 || r > _)
throw Error(p + "exponent");
for (n && (r = -r); r & 1 && (i = i.times(e)), r >>= 1, !!r; )
e = e.times(e);
return n ? t.div(i) : i;
};
h.prec = function(r, e) {
if (r !== ~~r || r < 1 || r > D)
throw Error(p + "precision");
return x(new this.constructor(this), r, e);
};
h.round = function(r, e) {
if (r === w) r = 0;
else if (r !== ~~r || r < -1e6 || r > D)
throw Error(P);
return x(new this.constructor(this), r + this.e + 1, e);
};
h.sqrt = function() {
var r, e, t, i = this, n = i.constructor, c = i.s, u = i.e, o = new n("0.5");
if (!i.c[0]) return new n(i);
if (c < 0)
throw Error(M + "No square root");
c = Math.sqrt(+N(i, !0, !0)), c === 0 || c === 1 / 0 ? (e = i.c.join(""), e.length + u & 1 || (e += "0"), c = Math.sqrt(e), u = ((u + 1) / 2 | 0) - (u < 0 || u & 1), r = new n((c == 1 / 0 ? "5e" : (c = c.toExponential()).slice(0, c.indexOf("e") + 1)) + u)) : r = new n(c + ""), u = r.e + (n.DP += 4);
do
t = r, r = o.times(t.plus(i.div(t)));
while (t.c.slice(0, u).join("") !== r.c.slice(0, u).join(""));
return x(r, (n.DP -= 4) + r.e + 1, n.RM);
};
h.times = h.mul = function(r) {
var e, t = this, i = t.constructor, n = t.c, c = (r = new i(r)).c, u = n.length, o = c.length, s = t.e, f = r.e;
if (r.s = t.s == r.s ? 1 : -1, !n[0] || !c[0])
return r.c = [r.e = 0], r;
for (r.e = s + f, u < o && (e = n, n = c, c = e, f = u, u = o, o = f), e = new Array(f = u + o); f--; ) e[f] = 0;
for (s = o; s--; ) {
for (o = 0, f = u + s; f > s; )
o = e[f] + c[s] * n[f - s - 1] + o, e[f--] = o % 10, o = o / 10 | 0;
e[f] = o;
}
for (o ? ++r.e : e.shift(), s = e.length; !e[--s]; ) e.pop();
return r.c = e, r;
};
h.toExponential = function(r, e) {
var t = this, i = t.c[0];
if (r !== w) {
if (r !== ~~r || r < 0 || r > D)
throw Error(P);
for (t = x(new t.constructor(t), ++r, e); t.c.length < r; ) t.c.push(0);
}
return N(t, !0, !!i);
};
h.toFixed = function(r, e) {
var t = this, i = t.c[0];
if (r !== w) {
if (r !== ~~r || r < 0 || r > D)
throw Error(P);
for (t = x(new t.constructor(t), r + t.e + 1, e), r = r + t.e + 1; t.c.length < r; ) t.c.push(0);
}
return N(t, !1, !!i);
};
h.toJSON = h.toString = function() {
var r = this, e = r.constructor;
return N(r, r.e <= e.NE || r.e >= e.PE, !!r.c[0]);
};
typeof Symbol < "u" && (h[Symbol.for("nodejs.util.inspect.custom")] = h.toJSON);
h.toNumber = function() {
var r = +N(this, !0, !0);
if (this.constructor.strict === !0 && !this.eq(r.toString()))
throw Error(M + "Imprecise conversion");
return r;
};
h.toPrecision = function(r, e) {
var t = this, i = t.constructor, n = t.c[0];
if (r !== w) {
if (r !== ~~r || r < 1 || r > D)
throw Error(p + "precision");
for (t = x(new i(t), r, e); t.c.length < r; ) t.c.push(0);
}
return N(t, r <= t.e || t.e <= i.NE || t.e >= i.PE, !!n);
};
h.valueOf = function() {
var r = this, e = r.constructor;
if (e.strict === !0)
throw Error(M + "valueOf disallowed");
return N(r, r.e <= e.NE || r.e >= e.PE, !0);
};
var R = q();
function $(r = 0, e = 0) {
try {
return new R(r).round(e, 0).toFixed(e);
} catch {
return new R(0).toFixed(e);
}
}
function d(r = 0, e = 0) {
const i = $(r, e).toString().split(".");
return i[0] = i[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","), i.join(".");
}
function z(r) {
if (!r.length) return { min: NaN, max: NaN };
let e = -1 / 0, t = 1 / 0;
return r.forEach(([i, n]) => {
e = Math.max(e, i), t = Math.min(t, n);
}), e > t ? { min: NaN, max: NaN } : { min: e, max: t };
}
function H(r) {
return /^0\.\d+$/.test(r) ? r.replace(/^0/, "") : /^\d*\.?\d+$/.test(r) ? r.replace(/^0+(?=\d)/, "") : r;
}
export {
d as formatCurrency,
z as intersectionMin,
H as removeLeadingZero,
$ as safeFormatDecimal
};