Dart / Flutter - Cómo parsear una cadena de texto (String) en un número

- Andrés Cruz

In english
Dart / Flutter - Cómo parsear una cadena de texto (String) en un número

En esta publicación, aprendemos algunos métodos para analizar / convertir String en un número (entero, doble o ambos).

1. Utilice el método parse() (no recomendado)

  int stringToInt_parse(String input) {
    return int.parse(input, onError: (error) {
      return NULL;
    });
  }

  double stringToDouble_parse(String input) {
    return double.parse(input, (error) {
      return NULL;
    });
  }

  num stringToNumber_parse(String input) {
    return num.parse(input, (error) {
      return NULL;
    });
  }

Salidas

  print(stringToInt_parse(testInt)); // 100
  print(stringToDouble_parse(testInt)); // 100.0
  print(stringToNumber_parse(testInt)); // 100

  print(stringToInt_parse(testDouble)); // NULL
  print(stringToDouble_parse(testDouble)); // 100.1
  print(stringToNumber_parse(testDouble)); // 100.1

  print(stringToInt_parse(testInvalidNumber)); // NULL
  print(stringToDouble_parse(testInvalidNumber)); // NULL
  print(stringToNumber_parse(testInvalidNumber)); // NULL

Notas:

  1. Podemos usar double.parse () para convertir una cadena entera válida a int, pero devolverá un doble (Línea 7: 100.0). Y obviamente no podemos convertir un string doble válido en un entero, devolverá nulo (Línea 10: nulo).
  2. Con num.parse (), el programa intentará analizar primero el número entero, si no puede analizar (obtener un valor nulo), entonces intentará analizar el doble. (Es por eso que en la línea 8, la salida es 100 pero no 100,0).
  3. No sé exactamente la razón detrás de esto, pero si observa la firma de int.parse (), double.parse () y num.parse (), verá que onError es un parámetro con nombre opcional en int. parse () mientras que con double.parse () y num.parse () es un parámetro posicional opcional.

2. Utilice el método tryParse()

Cuando usamos el método tryParse(), solo necesitamos proporcionar la cadena de entrada. En caso de que la entrada no sea válida, el programa devolverá un valor nulo. Esta es la diferencia entre tryParse () y parse () (que genera una excepción si no manejamos el método onError).

int stringToInt_tryParse(String input) {
  return int.tryParse(input);
}

double stringToDouble_tryParse(String input) {
  return double.tryParse(input);
}

num stringToNumber_tryParse(String input) {
  return num.tryParse(input);
}

Probar

  final testInt = '100';
  final testDouble = '100.1';
  final testInvalidNumber = 'a';

  print(stringToInt_tryParse(testInt)); // 100
  print(stringToDouble_tryParse(testInt)); // 100.0
  print(stringToNumber_tryParse(testInt)); // 100

  print(stringToDouble_tryParse(testInt)); // 100.0
  print(stringToDouble_tryParse(testDouble)); // 100.1
  print(stringToNumber_tryParse(testDouble)); // 100.1

  print(stringToInt_tryParse(testInvalidNumber)); // NULL
  print(stringToDouble_tryParse(testInvalidNumber)); // NULL
  print(stringToNumber_tryParse(testInvalidNumber)); // NULL

3. (Bonificación) Utilice métodos de extensión

En caso de que no sepa qué son los métodos de extensión, es una forma de agregar más funciones a las bibliotecas / clases existentes. En nuestro caso, usamos esta técnica para agregar 3 métodos a la clase String.

extension StringExtension on String {
  int toInt() {
    return int.tryParse(this);
  }

  double toDouble() {
    return double.tryParse(this);
  }

  num toNumber() {
    return num.tryParse(this);
  }
}

Después de crear la extensión anterior, ahora nuestro String tiene 3 métodos más que podemos usar como otros métodos de salida. 

  final testInt = '100';
  final testDouble = '100.1';
  final testInvalidNumber = 'a';

  print(testInt.toInt()); // 100
  print(testInt.toDouble()); // 100.0
  print(testInt.toNumber()); // 100

  print(testDouble.toInt()); // NULL
  print(testDouble.toDouble()); // 100.1
  print(testDouble.toNumber()); // 100.1

  print(testInvalidNumber.toInt()); // NULL
  print(testInvalidNumber.toDouble()); // NULL
  print(testInvalidNumber.toNumber()); // NULL
Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz en Udemy

Acepto recibir anuncios de interes sobre este Blog.