export const isFiniteNumber = (value: unknown): value is number => typeof value === 'number' && Number.isFinite(value) export const toFiniteNumberOrNull = (value: unknown): number | null => isFiniteNumber(value) ? value : null export const parseNumberOrNull = ( value: unknown, options?: { sanitize?: boolean; precision?: number } ): number | null => { if (value === '' || value == null) return null const normalized = options?.sanitize && typeof value === 'string' ? value.replace(/[^0-9.\-]/g, '') : value const numericValue = Number(normalized) if (!Number.isFinite(numericValue)) return null const precision = options?.precision if (typeof precision !== 'number' || !Number.isInteger(precision) || precision < 0) { return numericValue } const factor = 10 ** precision if (!Number.isFinite(factor) || factor <= 0) return numericValue if (numericValue >= 0) return Math.round((numericValue + Number.EPSILON) * factor) / factor return -Math.round((-numericValue + Number.EPSILON) * factor) / factor }