UNPKG

@techmely/utils

Version:

Collection of helpful JavaScript / TypeScript utils

110 lines (105 loc) 3.16 kB
/*! * @techmely/utils * Copyright(c) 2021-2024 Techmely <techmely.creation@gmail.com> * MIT Licensed */ import { isNumber } from "./chunk-BD32CMSL.mjs"; // src/number.ts function formatNumber(num, precision = 0, defaultValue = "-") { if (!isNumber(num)) { return defaultValue; } return num.toLocaleString("en", { minimumFractionDigits: precision, maximumFractionDigits: precision }); } function formatLot10Volume(volume, precision = 0, defaultValue = "-") { if (!isNumber(volume)) { return defaultValue; } return (volume * 10)?.toLocaleString("en", { minimumFractionDigits: precision }).slice(0, -1); } function Strip(num, precision = 15) { return +parseFloat(Number(num).toPrecision(precision)); } function DigitLength(num) { const eSplit = num.toString().split(/[eE]/); const len = (eSplit[0].split(".")[1] || "").length - +(eSplit[1] || 0); return len > 0 ? len : 0; } function Float2Fixed(num) { if (num.toString().indexOf("e") === -1) { return Number(num.toString().replace(".", "")); } const dLen = DigitLength(num); const powDLen = 10 ** dLen; return dLen > 0 ? Strip(Number(num) * powDLen) : Number(num); } var _boundaryCheckingState = true; function CheckBoundary(num) { if (_boundaryCheckingState) { if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) { console.warn( `${num} is beyond boundary when transfer to integer, the results may not be accurate` ); } } } function npCreateOperation(operation) { return (...nums) => { const [first, ...others] = nums; return others.reduce((prev, next) => operation(prev, next), first); }; } var Times = npCreateOperation((num1, num2) => { const num1Changed = Float2Fixed(num1); const num2Changed = Float2Fixed(num2); const baseNum = DigitLength(num1) + DigitLength(num2); const leftValue = num1Changed * num2Changed; CheckBoundary(leftValue); const baseNumPow = 10 ** baseNum; return leftValue / baseNumPow; }); var Plus = npCreateOperation((num1, num2) => { const baseNum = 10 ** Math.max(DigitLength(num1), DigitLength(num2)); return (Times(num1, baseNum) + Times(num2, baseNum)) / baseNum; }); var Minus = npCreateOperation((num1, num2) => { const baseNum = 10 ** Math.max(DigitLength(num1), DigitLength(num2)); return (Times(num1, baseNum) - Times(num2, baseNum)) / baseNum; }); var Divide = npCreateOperation((num1, num2) => { const num1Changed = Float2Fixed(num1); const num2Changed = Float2Fixed(num2); CheckBoundary(num1Changed); CheckBoundary(num2Changed); return Times(num1Changed / num2Changed, Strip(10 ** (DigitLength(num2) - DigitLength(num1)))); }); function Round(num, decimal) { const base = 10 ** decimal; let result = Divide(Math.round(Math.abs(Times(num, base))), base); if (isNumber(num) && num < 0 && result !== 0) { result = Times(result, -1); } return result; } function EnableBoundaryChecking(flag = true) { _boundaryCheckingState = flag; } export { formatNumber, formatLot10Volume, Strip, DigitLength, Float2Fixed, CheckBoundary, Times, Plus, Minus, Divide, Round, EnableBoundaryChecking };