From b44e9e5702bde89be3b3316def00eaebed40cc66 Mon Sep 17 00:00:00 2001 From: Codex Agent Date: Mon, 9 Mar 2026 19:50:26 +0000 Subject: [PATCH] Normalize conversion factor formatting --- .../components/QuickConversionExample.svelte | 34 +++++++------------ hdyc-svelte/src/lib/utils/conversionRate.ts | 7 +++- .../src/lib/utils/formatConversionValue.ts | 17 ++++++++++ tests/test_conversion_rate_tooltip.py | 27 +++++++++++++++ tests/test_quick_conversion_formatting.py | 26 ++++++++++++++ 5 files changed, 88 insertions(+), 23 deletions(-) create mode 100644 hdyc-svelte/src/lib/utils/formatConversionValue.ts create mode 100644 tests/test_conversion_rate_tooltip.py create mode 100644 tests/test_quick_conversion_formatting.py diff --git a/hdyc-svelte/src/lib/components/QuickConversionExample.svelte b/hdyc-svelte/src/lib/components/QuickConversionExample.svelte index e75ef49..2831c77 100644 --- a/hdyc-svelte/src/lib/components/QuickConversionExample.svelte +++ b/hdyc-svelte/src/lib/components/QuickConversionExample.svelte @@ -1,6 +1,7 @@ {#if supportsExample && result}

How to convert {config.labels.in1} to {config.labels.in2}

- 1 {config.labels.in1} = {config.factor}{config.offset ? ` + ${config.offset}` : ''} {config.labels.in2} + 1 {config.labels.in1} = {formattedFactorValue}{hasOffset ? ` + ${formattedOffsetValue}` : ''} {config.labels.in2}

1 {config.labels.in2} = {formattedReverseValue} {config.labels.in1} diff --git a/hdyc-svelte/src/lib/utils/conversionRate.ts b/hdyc-svelte/src/lib/utils/conversionRate.ts index f464085..6f54a44 100644 --- a/hdyc-svelte/src/lib/utils/conversionRate.ts +++ b/hdyc-svelte/src/lib/utils/conversionRate.ts @@ -1,4 +1,5 @@ import type { CalculatorDef } from '$lib/data/calculators'; +import { formatConversionValue } from '$lib/utils/formatConversionValue'; type RateConfig = Pick; @@ -12,5 +13,9 @@ export const getConversionRateText = (config: RateConfig): string | null => { return null; } - return `1 ${in1} = ${config.factor}${config.offset ? ` + ${config.offset}` : ''} ${in2}`; + const formattedFactor = formatConversionValue(config.factor); + const hasOffset = Boolean(config.offset); + const formattedOffset = formatConversionValue(config.offset ?? 0); + + return `1 ${in1} = ${formattedFactor}${hasOffset ? ` + ${formattedOffset}` : ''} ${in2}`; }; diff --git a/hdyc-svelte/src/lib/utils/formatConversionValue.ts b/hdyc-svelte/src/lib/utils/formatConversionValue.ts new file mode 100644 index 0000000..fb4adbd --- /dev/null +++ b/hdyc-svelte/src/lib/utils/formatConversionValue.ts @@ -0,0 +1,17 @@ +export function formatConversionValue(value: number | null | undefined): string { + if (value === null || value === undefined || Number.isNaN(value)) { + return '—'; + } + if (!Number.isFinite(value)) { + return value.toString(); + } + if (value === 0) { + return '0'; + } + const rounded = parseFloat(value.toFixed(6)); + if (rounded !== 0) { + return rounded.toString(); + } + const precise = value.toFixed(12).replace(/\.?0+$/, ''); + return precise || '0'; +} diff --git a/tests/test_conversion_rate_tooltip.py b/tests/test_conversion_rate_tooltip.py new file mode 100644 index 0000000..43a0dd3 --- /dev/null +++ b/tests/test_conversion_rate_tooltip.py @@ -0,0 +1,27 @@ +import unittest +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +CONVERSION_RATE = ( + ROOT / "hdyc-svelte" / "src" / "lib" / "utils" / "conversionRate.ts" +) + + +class ConversionRateTooltipFormattingTests(unittest.TestCase): + def test_conversion_rate_text_uses_formatter(self) -> None: + text = CONVERSION_RATE.read_text(encoding="utf-8") + normalized = " ".join(text.split()) + self.assertIn( + "formatConversionValue(config.factor)", + normalized, + "Conversion rate helper must format the factor before inserting it into the tooltip text", + ) + self.assertIn( + "formatConversionValue(config.offset ?? 0)", + normalized, + "Conversion rate tooltip must format any offset before rendering", + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_quick_conversion_formatting.py b/tests/test_quick_conversion_formatting.py new file mode 100644 index 0000000..5b53a1d --- /dev/null +++ b/tests/test_quick_conversion_formatting.py @@ -0,0 +1,26 @@ +import unittest +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +QUICK_CONVERSION_EXAMPLE = ( + ROOT / "hdyc-svelte" / "src" / "lib" / "components" / "QuickConversionExample.svelte" +) + + +class QuickConversionExampleFormattingTests(unittest.TestCase): + def test_formula_uses_formatted_factor_and_offset(self) -> None: + text = QUICK_CONVERSION_EXAMPLE.read_text(encoding="utf-8") + normalized = " ".join(text.split()) + snippet = ( + "1 {config.labels.in1} = {formattedFactorValue}{hasOffset ? ` + ${formattedOffsetValue}` : ''} " + "{config.labels.in2}" + ) + self.assertIn( + snippet, + normalized, + "The formula snippet should render formatted factor/offset values instead of raw floats", + ) + + +if __name__ == "__main__": + unittest.main()