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 },
});