UNPKG

@acrool/js-utils

Version:

Common javascript utils methods for project development

299 lines (298 loc) 10.6 kB
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 };