31 lines
1.0 KiB
TypeScript
31 lines
1.0 KiB
TypeScript
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
|
|
}
|