UNPKG

@cute-dw/core

Version:

This TypeScript library is the main part of a more powerfull package designed for the fast WEB software development. The cornerstone of the library is the **DataStore** class, which might be useful when you need a full control of the data, but do not need

88 lines 10.9 kB
/** * This class consists exclusively of the static methods that operate on or return numeric values */ export class Numbers { /** * Rounds a number to the specified number of decimal places * @param value The number you want to round * @param ndec The number of decimal places to which you want to round a `value`. Default is 0. * @returns The result of the roundation if it succeeds and _NaN_ if it fails or if any argument is _NaN_ * @example * Number.round(2.5724, 3); // 2.572 * Number.round(1.005, 2); // 1.01 * Number.round(12345, -2); // 12300 */ static round(value, ndec = 0) { let res = NaN; ndec = ndec ?? 0; if (Number.isFinite(value) || Number.isFinite(ndec)) { const pwr = 10 ** ndec; // EPSILON is added to resolve cases like this: console.log(Numbers.round(1.005, 2)); // 1 !!!??? if (value > 0) res = Math.round((value + Number.EPSILON) * pwr) / pwr; else if (value < 0) res = -(Math.round(-(value - Number.EPSILON) * pwr) / pwr); else res = Math.round(value); if (ndec < 0) { res = Math.trunc(res); } } return res; } /** * Truncates a number to the specified number of decimal places * @param value The number you want to truncate * @param ndec The number of decimal places to which you want to truncate a `value`. Default is 0. * @returns The result of the truncation if it succeeds and _NaN_ if it fails or if any argument is _NaN_ */ static truncate(value, ndec = 0) { ndec = ndec ?? 0; if (Number.isFinite(value) || Number.isFinite(ndec)) { if (ndec == 0) { return Math.trunc(value); } const pwr = 10 ** ndec; return Math.trunc(value * pwr) / pwr; } return NaN; } /** * Gets the fraction part of the `value` * @param value Source value * @param roundTo Optional number of decimal places to round * @returns Fraction value */ static fraction(value, roundTo) { if (Number.isFinite(value)) { const res = value % 1; return res <= Number.EPSILON ? 0 : Numbers.round(res, roundTo ?? Numbers.ROUND_PRECISION); } return NaN; } /** * Checks the specified value for `NaN` and returns this value if the result of testing is falsy or another value when else. * @param v1 Value to check * @param v2 Value to return if `v1` is `NaN` * @returns `v1` itself if `v1` is a finite number or `v2` if it is a `NaN` */ static ifNaN(v1, v2) { return (Number.isNaN(v1)) ? v2 : v1; } /** * Return whether the provided value is in the range of the two specified values * * @param value The value to test. * @param lowBound Low boundary's value * @param uppBound Upper boundary's value * @returns Boolean value, or _null_ if error occurs */ static inRange(value, lowBound, uppBound) { if (Number.isFinite(value) && Number.isFinite(lowBound) && Number.isFinite(uppBound)) { return value >= lowBound && value <= uppBound; } return null; } } Numbers.ROUND_PRECISION = 16; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTnVtYmVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2N1dGUtY29yZS9zcmMvbGliL3V0aWwvTnVtYmVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sT0FBTyxPQUFPO0lBRWxCOzs7Ozs7Ozs7T0FTRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBYSxFQUFFLE9BQWUsQ0FBQztRQUMxQyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZCxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUNqQixJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNuRCxNQUFNLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDO1lBQ3ZCLGtHQUFrRztZQUNsRyxJQUFJLEtBQUssR0FBRyxDQUFDO2dCQUNYLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxHQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7aUJBQ2xELElBQUksS0FBSyxHQUFHLENBQUM7Z0JBQ2hCLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQzs7Z0JBRXpELEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRTtnQkFDWixHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN2QjtTQUNGO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ0Q7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQWEsRUFBRSxPQUFlLENBQUM7UUFDN0MsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7UUFDakIsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDbkQsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFO2dCQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMxQjtZQUNELE1BQU0sR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUM7WUFDdkIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7U0FDdEM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFDRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBYSxFQUFFLE9BQWdCO1FBQzdDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMxQixNQUFNLEdBQUcsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLE9BQU8sR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUMzRjtRQUNELE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztJQUNEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFPLEVBQUUsRUFBTztRQUMzQixPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBQ0Q7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBYSxFQUFFLFFBQWdCLEVBQUUsUUFBZ0I7UUFDOUQsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNwRixPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksS0FBSyxJQUFJLFFBQVEsQ0FBQztTQUMvQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7QUFqRnVCLHVCQUFlLEdBQUcsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFRoaXMgY2xhc3MgY29uc2lzdHMgZXhjbHVzaXZlbHkgb2YgdGhlIHN0YXRpYyBtZXRob2RzIHRoYXQgb3BlcmF0ZSBvbiBvciByZXR1cm4gbnVtZXJpYyB2YWx1ZXNcclxuICovXHJcbmV4cG9ydCBjbGFzcyBOdW1iZXJzIHtcclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBST1VORF9QUkVDSVNJT04gPSAxNjtcclxuICAvKipcclxuICAgKiBSb3VuZHMgYSBudW1iZXIgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXNcclxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIG51bWJlciB5b3Ugd2FudCB0byByb3VuZFxyXG4gICAqIEBwYXJhbSBuZGVjIFRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdG8gd2hpY2ggeW91IHdhbnQgdG8gcm91bmQgYSBgdmFsdWVgLiBEZWZhdWx0IGlzIDAuXHJcbiAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgcm91bmRhdGlvbiBpZiBpdCBzdWNjZWVkcyBhbmQgX05hTl8gaWYgaXQgZmFpbHMgb3IgaWYgYW55IGFyZ3VtZW50IGlzIF9OYU5fXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiBOdW1iZXIucm91bmQoMi41NzI0LCAzKTsgLy8gMi41NzJcclxuICAgKiBOdW1iZXIucm91bmQoMS4wMDUsIDIpOyAgLy8gMS4wMVxyXG4gICAqIE51bWJlci5yb3VuZCgxMjM0NSwgLTIpOyAvLyAxMjMwMFxyXG4gICAqL1xyXG4gIHN0YXRpYyByb3VuZCh2YWx1ZTogbnVtYmVyLCBuZGVjOiBudW1iZXIgPSAwKTogbnVtYmVyIHtcclxuICAgIGxldCByZXMgPSBOYU47XHJcbiAgICBuZGVjID0gbmRlYyA/PyAwO1xyXG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgfHwgTnVtYmVyLmlzRmluaXRlKG5kZWMpKSB7XHJcbiAgICAgIGNvbnN0IHB3ciA9IDEwICoqIG5kZWM7XHJcbiAgICAgIC8vIEVQU0lMT04gaXMgYWRkZWQgdG8gcmVzb2x2ZSBjYXNlcyBsaWtlIHRoaXM6IGNvbnNvbGUubG9nKE51bWJlcnMucm91bmQoMS4wMDUsIDIpKTsgLy8gMSAgISEhPz8/XHJcbiAgICAgIGlmICh2YWx1ZSA+IDApXHJcbiAgICAgICAgcmVzID0gTWF0aC5yb3VuZCgodmFsdWUrTnVtYmVyLkVQU0lMT04pICogcHdyKSAvIHB3cjtcclxuICAgICAgZWxzZSBpZiAodmFsdWUgPCAwKVxyXG4gICAgICAgIHJlcyA9IC0oTWF0aC5yb3VuZCgtKHZhbHVlLU51bWJlci5FUFNJTE9OKSAqIHB3cikgLyBwd3IpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmVzID0gTWF0aC5yb3VuZCh2YWx1ZSk7XHJcbiAgICAgIGlmIChuZGVjIDwgMCkge1xyXG4gICAgICAgIHJlcyA9IE1hdGgudHJ1bmMocmVzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVHJ1bmNhdGVzIGEgbnVtYmVyIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzXHJcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBudW1iZXIgeW91IHdhbnQgdG8gdHJ1bmNhdGVcclxuICAgKiBAcGFyYW0gbmRlYyBUaGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRvIHdoaWNoIHlvdSB3YW50IHRvIHRydW5jYXRlIGEgYHZhbHVlYC4gRGVmYXVsdCBpcyAwLlxyXG4gICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIHRydW5jYXRpb24gaWYgaXQgc3VjY2VlZHMgYW5kIF9OYU5fIGlmIGl0IGZhaWxzIG9yIGlmIGFueSBhcmd1bWVudCBpcyBfTmFOX1xyXG4gICAqL1xyXG4gIHN0YXRpYyB0cnVuY2F0ZSh2YWx1ZTogbnVtYmVyLCBuZGVjOiBudW1iZXIgPSAwKTogbnVtYmVyIHtcclxuICAgIG5kZWMgPSBuZGVjID8/IDA7XHJcbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCBOdW1iZXIuaXNGaW5pdGUobmRlYykpIHtcclxuICAgICAgaWYgKG5kZWMgPT0gMCkge1xyXG4gICAgICAgIHJldHVybiBNYXRoLnRydW5jKHZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBwd3IgPSAxMCAqKiBuZGVjO1xyXG4gICAgICByZXR1cm4gTWF0aC50cnVuYyh2YWx1ZSAqIHB3cikgLyBwd3I7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gTmFOO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSBmcmFjdGlvbiBwYXJ0IG9mIHRoZSBgdmFsdWVgXHJcbiAgICogQHBhcmFtIHZhbHVlIFNvdXJjZSB2YWx1ZVxyXG4gICAqIEBwYXJhbSByb3VuZFRvIE9wdGlvbmFsIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0byByb3VuZFxyXG4gICAqIEByZXR1cm5zIEZyYWN0aW9uIHZhbHVlXHJcbiAgICovXHJcbiAgc3RhdGljIGZyYWN0aW9uKHZhbHVlOiBudW1iZXIsIHJvdW5kVG8/OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcclxuICAgICAgY29uc3QgcmVzID0gdmFsdWUgJSAxO1xyXG4gICAgICByZXR1cm4gcmVzIDw9IE51bWJlci5FUFNJTE9OID8gMCA6IE51bWJlcnMucm91bmQocmVzLCByb3VuZFRvID8/IE51bWJlcnMuUk9VTkRfUFJFQ0lTSU9OKTtcclxuICAgIH1cclxuICAgIHJldHVybiBOYU5cclxuICB9XHJcbiAgLyoqXHJcbiAgICogQ2hlY2tzIHRoZSBzcGVjaWZpZWQgdmFsdWUgZm9yIGBOYU5gIGFuZCByZXR1cm5zIHRoaXMgdmFsdWUgaWYgdGhlIHJlc3VsdCBvZiB0ZXN0aW5nIGlzIGZhbHN5IG9yIGFub3RoZXIgdmFsdWUgd2hlbiBlbHNlLlxyXG4gICAqIEBwYXJhbSB2MSBWYWx1ZSB0byBjaGVja1xyXG4gICAqIEBwYXJhbSB2MiBWYWx1ZSB0byByZXR1cm4gaWYgYHYxYCBpcyBgTmFOYFxyXG4gICAqIEByZXR1cm5zIGB2MWAgaXRzZWxmIGlmIGB2MWAgaXMgYSBmaW5pdGUgbnVtYmVyIG9yIGB2MmAgaWYgaXQgaXMgYSBgTmFOYFxyXG4gICAqL1xyXG4gIHN0YXRpYyBpZk5hTih2MTogYW55LCB2MjogYW55KTogYW55IHtcclxuICAgIHJldHVybiAoTnVtYmVyLmlzTmFOKHYxKSkgPyB2MiA6IHYxO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGUgcHJvdmlkZWQgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIG9mIHRoZSB0d28gc3BlY2lmaWVkIHZhbHVlc1xyXG4gICAqXHJcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0ZXN0LlxyXG4gICAqIEBwYXJhbSBsb3dCb3VuZCAgTG93IGJvdW5kYXJ5J3MgdmFsdWVcclxuICAgKiBAcGFyYW0gdXBwQm91bmQgIFVwcGVyIGJvdW5kYXJ5J3MgdmFsdWVcclxuICAgKiBAcmV0dXJucyBCb29sZWFuIHZhbHVlLCBvciBfbnVsbF8gaWYgZXJyb3Igb2NjdXJzXHJcbiAgICovXHJcbiAgc3RhdGljIGluUmFuZ2UodmFsdWU6IG51bWJlciwgbG93Qm91bmQ6IG51bWJlciwgdXBwQm91bmQ6IG51bWJlcik6IGJvb2xlYW4gfCBudWxsIHtcclxuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmIE51bWJlci5pc0Zpbml0ZShsb3dCb3VuZCkgJiYgTnVtYmVyLmlzRmluaXRlKHVwcEJvdW5kKSkge1xyXG4gICAgICByZXR1cm4gdmFsdWUgPj0gbG93Qm91bmQgJiYgdmFsdWUgPD0gdXBwQm91bmQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG59XHJcbiJdfQ==