¿Cómo analizo una cadena en un número con Dart?
Me gustaría analizar cadenas como 1
o 32.23
en números enteros y dobles. ¿Cómo puedo hacer esto con Dart?
Puedes analizar una cadena en un número entero con int.parse()
. Por ejemplo:
var myInt = int.parse('12345');
assert(myInt is int);
print(myInt); // 12345
Tenga en cuenta que int.parse()
acepta 0x
cadenas con prefijo. De lo contrario, la entrada se trata como base-10.
Puedes analizar una cadena en un doble con double.parse()
. Por ejemplo:
var myDouble = double.parse('123.45');
assert(myDouble is double);
print(myDouble); // 123.45
parse()
lanzará FormatException si no puede analizar la entrada.
En Dart 2 int.tryParse está disponible.
Devuelve nulo para entradas no válidas en lugar de arrojar. Puedes usarlo así:
int val = int.tryParse(text) ?? defaultValue;
Según dardo 2.6
onError
El parámetro opcional de int.parse
está en desuso . Por lo tanto, deberías utilizar int.tryParse
en su lugar.
Nota : Lo mismo se aplica a double.parse
. Por lo tanto, utilice double.tryParse
en su lugar.
/**
* ...
*
* The [onError] parameter is deprecated and will be removed.
* Instead of `int.parse(string, onError: (string) => ...)`,
* you should use `int.tryParse(string) ?? (...)`.
*
* ...
*/
external static int parse(String source, {int radix, @deprecated int onError(String source)});
La diferencia es que int.tryParse
regresa null
si la cadena fuente no es válida.
/**
* Parse [source] as a, possibly signed, integer literal and return its value.
*
* Like [parse] except that this function returns `null` where a
* similar call to [parse] would throw a [FormatException],
* and the [source] must still not be `null`.
*/
external static int tryParse(String source, {int radix});
Entonces, en tu caso debería verse así:
// Valid source value
int parsedValue1 = int.tryParse('12345');
print(parsedValue1); // 12345
// Error handling
int parsedValue2 = int.tryParse('');
if (parsedValue2 == null) {
print(parsedValue2); // null
//
// handle the error here ...
//
}
Las soluciones anteriores no funcionarán para String
casos como:
String str = '123 km';
Entonces, la respuesta en una sola línea, que me funciona en cada situación, será:
int r = int.tryParse(str.replaceAll(RegExp(r'[^0-9]'), '')) ?? defaultValue;
or
int? r = int.tryParse(str.replaceAll(RegExp(r'[^0-9]'), ''));
Pero tenga en cuenta que no funcionará para el siguiente tipo de cadena
String problemString = 'I am a fraction 123.45';
String moreProblem = '20 and 30 is friend';
Si desea extraer el doble, que funcionará en todos los tipos, utilice:
double d = double.tryParse(str.replaceAll(RegExp(r'[^0-9\.]'), '')) ?? defaultValue;
or
double? d = double.tryParse(str.replaceAll(RegExp(r'[^0-9\.]'), ''));
Esto funcionará problemString
pero no para moreProblem
.