UNPKG

universal-calci-pro

Version:

Calculator to calculate big number operations

400 lines 18.7 kB
"use strict"; // 1 = both valid controllable numbers // 2 = num1 is e and num 2 is normal // 3 = num1 is normal and num2 is e // 4 = both are decimal but not e // 5 = num1 is decimal and num2 is normal // 6 = num1 is normal and num2 is decimal // 7 = num1 is e and num2 is decimal // 8 = num1 is decimal and num2 is e // 9 = both are e // 10 = invalid number // 50 - num1 is not a number // 51 - num2 is not a number // 52 - num1 and num2 are not a number Object.defineProperty(exports, "__esModule", { value: true }); exports.multiplier = void 0; const toCustomFixed = (num, fixed) => { const re = new RegExp("^-?\\d+(?:.\\d{0," + (fixed || -1) + "})?"); return num.toString().match(re)[0]; }; function isNegative(num) { if (Math.sign(num) === -1) { return true; } return false; } const checkNumberTypes = (newNum1, newNum2) => { if (isNaN(newNum1)) return 50; else if (isNaN(newNum2)) return 51; else if (isNaN(newNum1) && isNaN(newNum2)) return 52; else if ((newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.includes(".")) && !(newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.includes("e")) && (newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.includes(".")) && !(newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.includes("e"))) return 4; else if ((newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.includes(".")) && !(newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.includes("e")) && !(newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.includes(".")) && !(newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.includes("e"))) return 5; else if (!(newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.includes(".")) && !(newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.includes("e")) && !(newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.includes("e")) && (newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.includes("."))) return 6; else if (!(newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.includes(".")) && !(newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.includes("e")) && !(newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.includes("e")) && !(newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.includes("."))) return 1; else if ((newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.includes("e")) && !(newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.includes("e")) && !(newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.includes("."))) return 2; else if (!(newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.includes(".")) && !(newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.includes("e")) && (newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.includes("e"))) return 3; else if ((newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.includes("e")) && (newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.includes(".")) && !(newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.includes("e"))) return 7; else if ((newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.includes(".")) && !(newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.includes("e")) && (newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.includes("e"))) return 8; // ============>>>>>>> else if ((newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.includes("e")) && (newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.includes("e"))) return 9; else return 10; }; const decimalAndECalculation = (newNum1, newNum2) => { var _a, _b, _c, _d; let splittedEValue; let baseValueMultiplication; let eDecimals; let isENegative; let newDecimals1; let weiValue; if (newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.includes("+")) splittedEValue = newNum1.split("e+"); else if (newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.includes("-")) { splittedEValue = newNum1.split("e-"); isENegative = true; } else if (!(newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.includes("+")) && !(newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.includes("-"))) { splittedEValue = newNum1.split("e"); } if ((_a = splittedEValue[0]) === null || _a === void 0 ? void 0 : _a.includes(".")) { baseValueMultiplication = multiplicationLogic((_b = splittedEValue[0]) === null || _b === void 0 ? void 0 : _b.replace(".", ""), newNum2, 0, 0, 0); eDecimals = ((_c = splittedEValue[0]) === null || _c === void 0 ? void 0 : _c.length) - ((_d = splittedEValue[0]) === null || _d === void 0 ? void 0 : _d.indexOf(".")) - 1; if (eDecimals <= splittedEValue[1]) { weiValue = isENegative ? "1" : "1".padEnd(splittedEValue[1] - eDecimals + 1, "0"); newDecimals1 = isENegative ? Number(splittedEValue[1]) + Number(eDecimals) : 0; } else { weiValue = "1"; newDecimals1 = isENegative ? Number(eDecimals) + Number(splittedEValue[1]) : eDecimals - splittedEValue[1]; } newDecimals1 = isENegative ? -newDecimals1 : newDecimals1; } else { baseValueMultiplication = multiplicationLogic(splittedEValue[0], newNum2, 0, 0, 0); if (isENegative) { weiValue = "1"; newDecimals1 = Number(splittedEValue[1]); newDecimals1 = -newDecimals1; } else { weiValue = "1".padEnd(Number(splittedEValue[1]) + 1, "0"); } } return { nume1: baseValueMultiplication, nume2: weiValue, decimals1: newDecimals1, decimals2: 0, }; }; const scientificCheck = (newNum1, newNum2, type) => { let calculatedOutput = {}; let firstEValueCalculated; let secondValuecalculated; let decimalLength; if (type == 2) { calculatedOutput = decimalAndECalculation(newNum1, newNum2); } else if (type == 3) { calculatedOutput = decimalAndECalculation(newNum2, newNum1); } else if (type == 9) { firstEValueCalculated = decimalAndECalculation(newNum1, "1"); secondValuecalculated = decimalAndECalculation(newNum2, "1"); calculatedOutput.nume1 = multiplicationLogic(firstEValueCalculated === null || firstEValueCalculated === void 0 ? void 0 : firstEValueCalculated.nume1, secondValuecalculated === null || secondValuecalculated === void 0 ? void 0 : secondValuecalculated.nume1, 0, 0, 0); calculatedOutput.nume2 = multiplicationLogic(firstEValueCalculated === null || firstEValueCalculated === void 0 ? void 0 : firstEValueCalculated.nume2, secondValuecalculated === null || secondValuecalculated === void 0 ? void 0 : secondValuecalculated.nume2, 0, 0, 0); let deci1 = Number(firstEValueCalculated === null || firstEValueCalculated === void 0 ? void 0 : firstEValueCalculated.decimals1) ? Number(firstEValueCalculated === null || firstEValueCalculated === void 0 ? void 0 : firstEValueCalculated.decimals1) : 0; let deci2 = Number(secondValuecalculated === null || secondValuecalculated === void 0 ? void 0 : secondValuecalculated.decimals1) ? Number(secondValuecalculated === null || secondValuecalculated === void 0 ? void 0 : secondValuecalculated.decimals1) : 0; calculatedOutput.decimals1 = deci1 + deci2; } else if (type == 7) { let removedDecimalValue = newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.replace(".", ""); calculatedOutput = decimalAndECalculation(newNum1, removedDecimalValue); decimalLength = (newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.length) - (newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.indexOf(".")) - 1; calculatedOutput.decimals1 = Number(calculatedOutput.decimals1) + Number(decimalLength); } else if (type == 8) { let removedDecimalValue = newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.replace(".", ""); calculatedOutput = decimalAndECalculation(newNum2, removedDecimalValue); decimalLength = (newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.length) - (newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.indexOf(".")) - 1; calculatedOutput.decimals1 = Number(calculatedOutput.decimals1) + Number(decimalLength); } return { nume1: calculatedOutput === null || calculatedOutput === void 0 ? void 0 : calculatedOutput.nume1, nume2: calculatedOutput === null || calculatedOutput === void 0 ? void 0 : calculatedOutput.nume2, decimals1: calculatedOutput === null || calculatedOutput === void 0 ? void 0 : calculatedOutput.decimals1, decimals2: calculatedOutput === null || calculatedOutput === void 0 ? void 0 : calculatedOutput.decimals2, }; }; const validateNumbers = (val1, val2) => { let newNum1 = val1 === null || val1 === void 0 ? void 0 : val1.toString(); let newNum2 = val2 === null || val2 === void 0 ? void 0 : val2.toString(); let length1 = newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.length; let length2 = newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.length; const validType = checkNumberTypes(newNum1, newNum2); switch (validType) { case 1: return { num1: newNum1, num2: newNum2, decimals1: 0, decimals2: 0, }; case 10: case 50: case 51: case 52: return { num1: 0, num2: 0, decimals1: 0, decimals2: 0, }; case 2: let case2 = scientificCheck(newNum1, newNum2, 2); return { num1: case2 === null || case2 === void 0 ? void 0 : case2.nume1, num2: case2 === null || case2 === void 0 ? void 0 : case2.nume2, decimals1: case2 === null || case2 === void 0 ? void 0 : case2.decimals1, decimals2: 0, }; case 3: let case3 = scientificCheck(newNum1, newNum2, 3); return { num1: case3 === null || case3 === void 0 ? void 0 : case3.nume1, num2: case3 === null || case3 === void 0 ? void 0 : case3.nume2, decimals1: case3 === null || case3 === void 0 ? void 0 : case3.decimals1, decimals2: 0, }; case 4: return { num1: newNum1.replace(".", ""), num2: newNum2.replace(".", ""), decimals1: (newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.length) - (newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.indexOf(".")) - 1, decimals2: (newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.length) - (newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.indexOf(".")) - 1, }; case 5: return { num1: newNum1.replace(".", ""), num2: newNum2, decimals1: (newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.length) - (newNum1 === null || newNum1 === void 0 ? void 0 : newNum1.indexOf(".")) - 1, decimals2: 0, }; case 6: return { num1: newNum1, num2: newNum2.replace(".", ""), decimals1: 0, decimals2: (newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.length) - (newNum2 === null || newNum2 === void 0 ? void 0 : newNum2.indexOf(".")) - 1, }; case 7: let case7 = scientificCheck(newNum1, newNum2, 7); return { num1: case7 === null || case7 === void 0 ? void 0 : case7.nume1, num2: case7 === null || case7 === void 0 ? void 0 : case7.nume2, decimals1: case7 === null || case7 === void 0 ? void 0 : case7.decimals1, decimals2: 0, }; case 8: let case8 = scientificCheck(newNum1, newNum2, 8); return { num1: case8 === null || case8 === void 0 ? void 0 : case8.nume1, num2: case8 === null || case8 === void 0 ? void 0 : case8.nume2, decimals1: case8 === null || case8 === void 0 ? void 0 : case8.decimals1, decimals2: 0, }; case 9: let case9 = scientificCheck(newNum1, newNum2, 9); return { num1: case9 === null || case9 === void 0 ? void 0 : case9.nume1, num2: case9 === null || case9 === void 0 ? void 0 : case9.nume2, decimals1: case9 === null || case9 === void 0 ? void 0 : case9.decimals1, decimals2: 0, }; } }; const multiplicationLogic = (num1, num2, decimals1, decimals2, isNegative) => { let len2; let len1; while (num1.charAt(0) === "0") { num1 = num1.substring(1); } while (num2.charAt(0) === "0") { num2 = num2.substring(1); } len1 = num1 === null || num1 === void 0 ? void 0 : num1.length; len2 = num2 === null || num2 === void 0 ? void 0 : num2.length; if (!len1 || !len2) return 0; if (len1 == 0 || len2 == 0) return "0"; // will keep the result number in vector // in reverse order let result = new Array(len1 + len2).fill(0); // Below two indexes are used to // find positions in result. let i_n1 = 0; let i_n2 = 0; // Go from right to left in num1 for (var i = len1 - 1; i > -1; i--) { let carry = 0; let n1 = num1[i].charCodeAt(0) - 48; // To shift position to left after every // multiplication of a digit in num2 i_n2 = 0; // Go from right to left in num2 for (var j = len2 - 1; j > -1; j--) { // Take current digit of second number let n2 = num2[j].charCodeAt(0) - 48; // Multiply with current digit of first number // and add result to previously stored result // at current position. let summ = n1 * n2 + result[i_n1 + i_n2] + carry; // Carry for next iteration carry = Math.floor(summ / 10); // Store result result[i_n1 + i_n2] = summ % 10; i_n2 += 1; } // store carry in next cell if (carry > 0) result[i_n1 + i_n2] += carry; // To shift position to left after every // multiplication of a digit in num1. i_n1 += 1; // print(result) } // ignore '0's from the right i = result.length - 1; while (i >= 0 && result[i] == 0) i -= 1; // If all were '0's - means either both or // one of num1 or num2 were '0' if (i == -1) return "0"; // generate the result string let s = ""; while (i >= 0) { s += String.fromCharCode(result[i] + 48); i -= 1; } if (decimals1 || decimals2) { let finalDecimal = Number(decimals1) + Number(decimals2); // let negativeDigits = s.length + finalDecimal; // negativeDigits = negativeDigits < 0 ? -negativeDigits : negativeDigits; finalDecimal = finalDecimal < 0 ? -finalDecimal : finalDecimal; if (finalDecimal < s.length) { s = s.slice(0, s.length - finalDecimal) + "." + s.slice(s.length - finalDecimal, s.length); } else if (finalDecimal == s.length) { s = "0" + "." + s; } else { s = "0" + "." + "0".padStart(finalDecimal - s.length, "0") + s; } } if (s === null || s === void 0 ? void 0 : s.includes(".")) { if (Number(s === null || s === void 0 ? void 0 : s.split(".")[1]) == 0) { s = s === null || s === void 0 ? void 0 : s.split(".")[0]; } } if ((s === null || s === void 0 ? void 0 : s.includes(".")) && Number(s === null || s === void 0 ? void 0 : s.split(".")[1]) == 0) { s = toCustomFixed(s, 2); } if (isNegative == 1) { s = "-" + s; } return s; }; function multiplier(val1, val2) { if (typeof val1 != "string" || typeof val2 != "string") { return { input: "invalid , expected numbers as string !", output: 0, }; } let newVal1 = val1 === null || val1 === void 0 ? void 0 : val1.toString(); let newVal2 = val2 === null || val2 === void 0 ? void 0 : val2.toString(); const validType = checkNumberTypes(newVal1, newVal2); if (validType == 10 || validType == 50 || validType == 51 || validType == 52) { return { input: "invalid input", output: 0, }; } let isNegative; if ((newVal1 === null || newVal1 === void 0 ? void 0 : newVal1.charAt(0)) == "-" && (newVal2 === null || newVal2 === void 0 ? void 0 : newVal2.charAt(0)) != "-") { isNegative = 1; val1 = val1 === null || val1 === void 0 ? void 0 : val1.split("-")[1]; } if ((newVal1 === null || newVal1 === void 0 ? void 0 : newVal1.charAt(0)) != "-" && (newVal2 === null || newVal2 === void 0 ? void 0 : newVal2.charAt(0)) == "-") { val2 = val2 === null || val2 === void 0 ? void 0 : val2.split("-")[1]; isNegative = 1; } if ((newVal1 === null || newVal1 === void 0 ? void 0 : newVal1.charAt(0)) == "-" && (newVal2 === null || newVal2 === void 0 ? void 0 : newVal2.charAt(0)) == "-") { isNegative = 0; val1 = val1 === null || val1 === void 0 ? void 0 : val1.split("-")[1]; val2 = val2 === null || val2 === void 0 ? void 0 : val2.split("-")[1]; } if ((newVal1 === null || newVal1 === void 0 ? void 0 : newVal1.charAt(0)) != "-" && (newVal2 === null || newVal2 === void 0 ? void 0 : newVal2.charAt(0)) != "-") isNegative = 0; const { num1, num2, decimals1, decimals2 } = validateNumbers(val1, val2); return { input: "valid", output: multiplicationLogic(num1, num2, decimals1, decimals2, isNegative), }; } exports.multiplier = multiplier; //# sourceMappingURL=index.js.map