SLFloat.fromString constructor

SLFloat.fromString(
  1. String s
)

Implementation

SLFloat.fromString(String s) {
  final regex = RegExp(
      r'\A[ ]*(?<sign>[+-]?)'
      r'(?:'
      r'(?:'
      r'0x'
      r'(?:'
      r'(?<int>[0-9a-f]*)'
      r'(?:'
      r'(?:\.(?<frac>[0-9a-f]*))?'
      r')?'
      r'(?:p(?<exp>[-+]?[\d]*))?'
      r')?'
      r')'
      r'|'
      r'(?<dec>[\d]*[.]?[\d]*'
      r'(?:e[+-]?[\d]*)?'
      r')'
      r')',
      caseSensitive: false);

  final match = regex.firstMatch(s);
  double mantissa = 0.0;

  if (match?.namedGroup('dec')?.isNotEmpty ?? false) {
    mantissa = double.parse(match!.namedGroup('dec')!);
  }

  if (match?.namedGroup('int')?.isNotEmpty ?? false) {
    mantissa = int.parse(match!.namedGroup('int')!, radix: 16).toDouble();

    if (match.namedGroup('frac')?.isNotEmpty ?? false) {
      mantissa += int.parse(match.namedGroup('frac')!, radix: 16) /
          pow(16.0, match.namedGroup('frac')!.length);
    }

    if (match.namedGroup('exp')?.isNotEmpty ?? false) {
      mantissa *= pow(2.0, int.parse(match.namedGroup('exp')!));
    }
  }

  objValue = (match?.namedGroup('sign') == '-') ? -mantissa : mantissa;
}