[API reference](https://evolu.dev/docs/api-reference) › [@evolu/common](https://evolu.dev/docs/api-reference/common) › [Type](https://evolu.dev/docs/api-reference/common/Type) › FiniteNumberFromString

```ts
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](https://github.com/evoluhq/evolu/blob/bc4578a260dd15d5bbf94b83765ca05984d194cb/packages/common/src/Type.ts#L11451)

Transforms a decimal number string into a [FiniteNumber](https://evolu.dev/docs/api-reference/common/Type/variables/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](https://evolu.dev/docs/api-reference/common/Type/variables/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](https://evolu.dev/docs/api-reference/common/Type/variables/DecimalString) for exact
decimals. Encoding uses `String`, except that `-0` encodes as `"-0"`.

### Example

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