parse static method

BinarySize? parse(
  1. String size
)

Implementation

static BinarySize? parse(String size) {
  BinarySize? result;

  var exp = RegExp(r'(\d+).?(\d*)\s*(B|Ki?B|Mi?B|Gi?B|Ti?B|Pi?B|Ei?B)', caseSensitive: false);

  if (exp.hasMatch(size)) {
    result = BinarySize();

    var match = exp.firstMatch(size);

    if (match == null) return null;

    var integer = match.group(1) ?? '';
    var left = match.group(2) ?? '';
    var unit = match.group(3) ?? '';

    var diff = unit.toLowerCase().contains('i') ? 1000.0 : 1024.0;

    result.isInIecBase = diff == 1000;

    var scale = 1.0;

    switch (unit.toUpperCase().replaceAll('IB', 'B')) {
      case 'B':
        scale = 1;
        break;
      case 'KB':
        scale = diff;
        break;
      case 'MB':
        scale = diff * diff;
        break;
      case 'GB':
        scale = pow(diff, 3).toDouble();
        break;
      case 'TB':
        scale = pow(diff, 4).toDouble();
        break;
      case 'PB':
        scale = pow(diff, 5).toDouble();
        break;
      case 'EB':
        scale = pow(diff, 6).toDouble();
        break;
      default:
        scale = 1;
        break;
    }

    if (unit.contains('b')) scale *= 1.0 / 8.0;

    var p = 0;

    for (var i = integer.length - 1; i >= 0; --i, ++p) {
      var addon = (int.parse(integer[i]) * pow(10, p) * scale).toInt();
      result.bytesCount += addon;
    }

    p = -1;

    for (var i = 0; i < left.length; ++i, --p) {
      var addon = (int.parse(left[i]) * pow(10, p) * scale).toInt();
      result.bytesCount += addon;
    }
  }

  return result;
}