From c34e01c63eea9fb97d8d4e93546d884b0294e475 Mon Sep 17 00:00:00 2001 From: Maze Winther Date: Fri, 27 Mar 2026 21:24:59 +0100 Subject: refactor: clean up number formatting and step handling in property tabs --- apps/web/src/utils/math.ts | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) (limited to 'apps/web/src/utils/math.ts') diff --git a/apps/web/src/utils/math.ts b/apps/web/src/utils/math.ts index 6e912b43..8043871f 100644 --- a/apps/web/src/utils/math.ts +++ b/apps/web/src/utils/math.ts @@ -22,7 +22,7 @@ export function clampRound({ return Math.round(clamp({ value, min, max })); } -function getFractionDigitsForStep({ step }: { step: number }): number { +export function getFractionDigitsForStep({ step }: { step: number }): number { const normalizedStep = step.toString().toLowerCase(); if (normalizedStep.includes("e-")) { return Number(normalizedStep.split("e-")[1] ?? 0); @@ -59,12 +59,43 @@ export function isNearlyEqual({ export function formatNumberForDisplay({ value, + fractionDigits, + minFractionDigits = 0, maxFractionDigits = 6, }: { value: number; + fractionDigits?: number; + minFractionDigits?: number; maxFractionDigits?: number; }): string { - return Number(value.toFixed(maxFractionDigits)).toString(); + const resolvedMaxFractionDigits = Math.max( + 0, + fractionDigits ?? maxFractionDigits, + ); + const resolvedMinFractionDigits = Math.min( + Math.max(0, fractionDigits ?? minFractionDigits), + resolvedMaxFractionDigits, + ); + const fixedValue = value.toFixed(resolvedMaxFractionDigits); + + if (resolvedMaxFractionDigits === 0) { + return Number(fixedValue) === 0 ? "0" : fixedValue; + } + + const [integerPart, fractionPart = ""] = fixedValue.split("."); + const normalizedIntegerPart = Number(fixedValue) === 0 ? "0" : integerPart; + let trimmedFractionPart = fractionPart; + + while ( + trimmedFractionPart.length > resolvedMinFractionDigits && + trimmedFractionPart.endsWith("0") + ) { + trimmedFractionPart = trimmedFractionPart.slice(0, -1); + } + + return trimmedFractionPart + ? `${normalizedIntegerPart}.${trimmedFractionPart}` + : normalizedIntegerPart; } export function evaluateMathExpression({ -- cgit v1.3.1