directus
1import type { NumericValue } from '@directus/types';
2
3export function parseNumericString(stringValue: string): NumericValue | null {
4let number: NumericValue = Number(stringValue);
5
6if (isNaN(number) || !Number.isFinite(number)) {
7return null; // invalid numbers
8}
9
10if (number > Number.MAX_SAFE_INTEGER || number < Number.MIN_SAFE_INTEGER) {
11try {
12number = BigInt(stringValue);
13} catch {
14// BigInt parsing failed, e.g. it was a float larger than MAX_SAFE_INTEGER
15return null;
16}
17}
18
19// casting parsed value back to string should be equal the original value
20// (prevent unintended number parsing, e.g. String(7) !== "ob111")
21if (String(number) !== stringValue) {
22return null;
23}
24
25return number;
26}
27