parseDecimal static method
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);
}
}