/** * format.ts — shared metric value formatting helpers for the Energy view. * * Rules (from M5 polish requirements): * - device_class === "energy" → 3 decimal places (kWh values need precision) * - everything else → 2 decimal places * - null / undefined / NaN → placeholder "—" * - missing metric metadata → default 2 decimal places */ import type { MetricInfo } from './hooks' /** Placeholder shown when a value is unavailable. */ export const VALUE_PLACEHOLDER = '—' /** * Format a numeric metric value for display. * * @param value The raw value from the API payload (any type; non-numeric → "—"). * @param metric Optional metric metadata from /metrics. When absent, falls back * to 2 decimal places. * @returns A formatted string ready for display (e.g. "230.25" or "—"). */ export function formatMetricValue( value: unknown, metric?: MetricInfo | null, ): string { // Guard: null / undefined if (value === null || value === undefined) return VALUE_PLACEHOLDER const n = Number(value) // Guard: NaN or non-finite if (!Number.isFinite(n)) return VALUE_PLACEHOLDER // Determine decimal places from device_class. const decimals = metric?.device_class === 'energy' ? 3 : 2 return n.toFixed(decimals) }