API reference › @evolu/common › Type › FiniteNumberFromString
const FiniteNumberFromString: transform(
"FiniteNumberFromString",
String,
FiniteNumber,
{
from: (value: string): Result<number, FiniteNumberFromStringError> =>
/^-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?$/u.test(value)
? ok(globalThis.Number(value))
: err({ type: "FiniteNumberFromString", value }),
to: (value: FiniteNumber) =>
globalThis.Object.is(value, -0) ? "-0" : globalThis.String(value),
},
formatFiniteNumberFromStringError,
);
Defined in: packages/common/src/Type.ts:11451
Transforms a decimal number string into a FiniteNumber.
The string must consist of an optional minus sign, digits, an optional
fraction, and an optional exponent, as in -12.5e3. It accepts every string
that IntFromString accepts and the String text of every finite
number. Whitespace, a leading plus sign, a leading or trailing decimal point,
hexadecimal notation, Infinity, and NaN are rejected; the FiniteNumber
constraint then rejects values that overflow, such as 1e400.
Decoding rounds to the nearest double, so "0.1" is not exactly one tenth
and "1e-400" underflows to zero. Use DecimalString for exact
decimals. Encoding uses String, except that -0 encodes as "-0".
Example
import {
assertEqual,
assertErr,
assertOk,
FiniteNumberFromString,
} from "@evolu/common";
assertOk(FiniteNumberFromString.fromUnknown("-12.5"), -12.5);
assertOk(FiniteNumberFromString.fromUnknown("1e3"), 1000);
assertEqual(
FiniteNumberFromString.to(FiniteNumberFromString.orThrow("1.50")),
"1.5",
);
const invalid = FiniteNumberFromString.fromUnknown(".5");
assertErr(invalid, { type: "FiniteNumberFromString", value: ".5" });
assertEqual(
FiniteNumberFromString.formatError(invalid.error),
'The value ".5" is not a decimal number.',
);
assertErr(FiniteNumberFromString.fromUnknown("1e400"), {
type: "FiniteNumberFromString",
outputError: { type: "Finite", value: Infinity },
});