Normalize conversion factor formatting

This commit is contained in:
Codex Agent
2026-03-09 19:50:26 +00:00
parent c20f2ebc60
commit b44e9e5702
5 changed files with 88 additions and 23 deletions

View File

@@ -1,6 +1,7 @@
<script lang="ts">
import { solve } from '$lib/engine';
import type { CalculatorDef } from '$lib/data/calculators';
import { formatConversionValue } from '$lib/utils/formatConversionValue';
export let config: CalculatorDef;
@@ -17,40 +18,29 @@
? solve(config, 1, exampleInput.toString(), '', '')
: null;
$: offset = config.offset ?? 0;
$: formulaExpression = supportsExample
? `${exampleInput} × ${config.factor}${offset ? ` + ${offset}` : ''}`
$: hasOffset = Boolean(offset);
$: formattedFactorValue = supportsExample
? formatConversionValue(config.factor)
: '';
$: formattedOffsetValue = hasOffset
? formatConversionValue(offset)
: '';
$: formulaExpression = supportsExample
? `${exampleInput} × ${formattedFactorValue}${hasOffset ? ` + ${formattedOffsetValue}` : ''}`
: '';
const formatExampleValue = (value: number | null): string => {
if (value === null || 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';
};
$: reverseExampleValue =
supportsExample && config.factor !== 0
? (1 - offset) / config.factor
: null;
$: formattedReverseValue = formatExampleValue(reverseExampleValue);
$: formattedReverseValue = formatConversionValue(reverseExampleValue);
</script>
{#if supportsExample && result}
<section class="example-card">
<h3>How to convert {config.labels.in1} to {config.labels.in2}</h3>
<p class="example-note">
1 {config.labels.in1} = {config.factor}{config.offset ? ` + ${config.offset}` : ''} {config.labels.in2}
1 {config.labels.in1} = {formattedFactorValue}{hasOffset ? ` + ${formattedOffsetValue}` : ''} {config.labels.in2}
</p>
<p class="example-note">
1 {config.labels.in2} = {formattedReverseValue} {config.labels.in1}

View File

@@ -1,4 +1,5 @@
import type { CalculatorDef } from '$lib/data/calculators';
import { formatConversionValue } from '$lib/utils/formatConversionValue';
type RateConfig = Pick<CalculatorDef, 'type' | 'factor' | 'offset' | 'labels'>;
@@ -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}`;
};

View File

@@ -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';
}