diff --git a/packages/biggest/src/format-utils.ts b/packages/biggest/src/format-utils.ts new file mode 100644 index 0000000..8f47896 --- /dev/null +++ b/packages/biggest/src/format-utils.ts @@ -0,0 +1,77 @@ +import { addStrings } from "./utils"; + +/** + * Function to remove leading zeros from the result + * @param str + * @returns + */ +export function removeLeadingZerosFromResult(str: string): string { + if (str[0] === "-") { + return "-" + removeLeadingZerosFromResult(str.slice(1)); + } + let [integerPart, fractionalPart] = str.split("."); + integerPart = integerPart.replace(/^0+/, "") || "0"; + if (fractionalPart !== undefined) { + return integerPart + "." + fractionalPart; + } else { + return integerPart; + } +} + +/** + * Rounds the result to the specified precision + * @param result + * @param precision + * @returns + */ +export function roundResult(result: string, precision: number): string { + let [integerPart, fractionalPart] = result.split("."); + if (!fractionalPart) { + return result; + } + + // Check if there are additional digits + if (fractionalPart.length <= precision) { + fractionalPart = fractionalPart.padEnd(precision + 1, "0"); + } + + // Get the digit to be rounded + let roundingDigit = parseInt(fractionalPart[precision]); + + let fractionToRound = fractionalPart.slice(0, precision); + + if (roundingDigit >= 5) { + // Combine integer and fractional parts to create a large number + let combinedNumber = integerPart + fractionToRound; + + // Add 1 + let incrementedNumber = addStrings(combinedNumber, "1"); + + // Separate into new integer and fractional parts + let combinedLength = integerPart.length + fractionToRound.length; + let incrementedLength = incrementedNumber.length; + let lengthDifference = incrementedLength - combinedLength; + let newIntegerPartLength = integerPart.length + lengthDifference; + + let newIntegerPart = incrementedNumber.slice(0, newIntegerPartLength); + let newFractionalPart = incrementedNumber.slice(newIntegerPartLength); + + result = newIntegerPart; + if (newFractionalPart) { + result += "." + newFractionalPart; + } + } else { + // No rounding needed + result = integerPart; + if (fractionToRound) { + result += "." + fractionToRound; + } + } + + // Remove unnecessary trailing zeros in the fractional part + result = result.replace(/(\.\d*?[1-9])0+$/g, "$1"); + result = result.replace(/\.0+$/, ""); + result = result.replace(/\.$/, ""); + + return result; +} diff --git a/packages/biggest/src/utils.ts b/packages/biggest/src/utils.ts index 6c74637..13d6b5a 100644 --- a/packages/biggest/src/utils.ts +++ b/packages/biggest/src/utils.ts @@ -389,78 +389,5 @@ export function addStrings(num1: string, num2: string): string { return result; } -/** - * Function to remove leading zeros from the result - * @param str - * @returns - */ -export function removeLeadingZerosFromResult(str: string): string { - if (str[0] === "-") { - return "-" + removeLeadingZerosFromResult(str.slice(1)); - } - let [integerPart, fractionalPart] = str.split("."); - integerPart = integerPart.replace(/^0+/, "") || "0"; - if (fractionalPart !== undefined) { - return integerPart + "." + fractionalPart; - } else { - return integerPart; - } -} - -/** - * Rounds the result to the specified precision - * @param result - * @param precision - * @returns - */ -export function roundResult(result: string, precision: number): string { - let [integerPart, fractionalPart] = result.split("."); - if (!fractionalPart) { - return result; - } - - // Check if there are additional digits - if (fractionalPart.length <= precision) { - fractionalPart = fractionalPart.padEnd(precision + 1, "0"); - } - - // Get the digit to be rounded - let roundingDigit = parseInt(fractionalPart[precision]); - - let fractionToRound = fractionalPart.slice(0, precision); - - if (roundingDigit >= 5) { - // Combine integer and fractional parts to create a large number - let combinedNumber = integerPart + fractionToRound; - - // Add 1 - let incrementedNumber = addStrings(combinedNumber, "1"); - - // Separate into new integer and fractional parts - let combinedLength = integerPart.length + fractionToRound.length; - let incrementedLength = incrementedNumber.length; - let lengthDifference = incrementedLength - combinedLength; - let newIntegerPartLength = integerPart.length + lengthDifference; - - let newIntegerPart = incrementedNumber.slice(0, newIntegerPartLength); - let newFractionalPart = incrementedNumber.slice(newIntegerPartLength); - - result = newIntegerPart; - if (newFractionalPart) { - result += "." + newFractionalPart; - } - } else { - // No rounding needed - result = integerPart; - if (fractionToRound) { - result += "." + fractionToRound; - } - } - - // Remove unnecessary trailing zeros in the fractional part - result = result.replace(/(\.\d*?[1-9])0+$/g, "$1"); - result = result.replace(/\.0+$/, ""); - result = result.replace(/\.$/, ""); - - return result; -} +// Re-export formatting utilities (extracted to format-utils.ts for file-size compliance) +export { removeLeadingZerosFromResult, roundResult } from "./format-utils";