parseDecimal static method

Int128 parseDecimal(
  1. String s
)

Strict decimal parse: throws IntegerError on overflow/underflow, unlike the wrapping constructor.

Implementation

static Int128 parseDecimal(String s) {
  if (s.isEmpty) {
    throw ArgumentException.invalidOperationArguments(
      "parseDecimal",
      reason: 'Invalid decimal literal.',
      details: {"value": s},
    );
  }
  final negative = s.startsWith('-');
  final digits = negative ? s.substring(1) : s;
  if (digits.isEmpty) {
    throw ArgumentException.invalidOperationArguments(
      "parseDecimal",
      reason: 'Invalid decimal literal.',
      details: {"value": s},
    );
  }
  final mag = Uint128.parseDecimal(
    digits,
  ); // throws on bad chars or u128 overflow
  const minMag = Uint128.unsafe(
    Uint64.unsafe(_signBit32, 0),
    Uint64.zero,
  ); // 2^127
  if (negative) {
    if (mag > minMag) throw IntegerError.overflow;
    if (mag == minMag) return Int128.min;
    return Int128._((~mag) + Uint128.one); // negate
  } else {
    if (mag > Int128.max._bits) throw IntegerError.overflow;
    return Int128._(mag);
  }
}