Introducción a std.fmt.parseInt
En Zig, la función std.fmt.parseInt se encarga de convertir cadenas de texto en valores numéricos de tipos enteros. Esta utilidad es esencial cuando trabajas con entrada de usuarios, archivos de configuración o cualquier otra fuente de datos textual que contenga números.
Definición de la función
La firma de std.fmt.parseInt es la siguiente:
fn parseInt(comptime T: type, str: []const u8) !T
Donde:
Tes el tipo entero que deseamos obtener (por ejemplo,i32,u64).stres la cadena de texto que contiene el número a analizar.- El retorno es un valor de tipo
To un error en caso de que la conversión falle.
Reglas de análisis de texto
La función interpreta el contenido de str según las siguientes reglas:
- El número se interpreta como decimal por defecto.
- Si la cadena empieza por
0x,0Xse interpreta como hexadecimal. - Prefijos
0bo0Bindican binario. - Prefijos
0oo0Oindican octal. - Un signo
+o-al principio se acepta. - Los caracteres que no pertenecen a la base indicada provocan un error.
Errores comunes
La función puede devolver varios errores, entre los cuales se encuentran:
ParseIntError.EmptyString– Cadena vacía.ParseIntError.InvalidCharacter– Caracter no válido para la base.ParseIntError.Overflow– El valor excede la capacidad del tipoT.ParseIntError.SignOverflow– El signo provoca desbordamiento.
Ejemplo 1: Parseando un número decimal simple
Este ejemplo muestra cómo convertir la cadena "12345" en un entero de 32 bits con signo.
// Importamos el módulo de formato de Zig
const std = @import("std");
// Punto de entrada del programa
pub fn main() !void {
// La cadena que queremos convertir
const str = "12345";
// Usamos parseInt para convertir a i32
// La función devuelve un Result: ok o error
const result = std.fmt.parseInt(i32, str);
// Comprobamos si la conversión fue exitosa
if (result) |num| {
// Si es ok, imprimimos el número
std.debug.print("El número es {d}\\n", .{num});
} else |err| {
// En caso de error, lo mostramos
std.debug.print("Error al parsear: {s}\\n", .{@errorName(err)});
}
}
Comentario línea por línea:
const std = @import("std");– Importamos el paquete estándar de Zig, que contienefmt.pub fn main() !void {– Declaramos la función principal con retorno de tipo error-set (!void).const str = "12345";– Definimos la cadena a analizar.const result = std.fmt.parseInt(i32, str);– Llamamos a parseInt solicitando uni32.if (result) |num| {– Desestructuramos el Result: si es ok, entramos con el valornum.std.debug.print("El número es {d}\\n", .{num});– Imprimimos el número.} else |err| {– Si hubo error, entramos conerr.std.debug.print("Error al parsear: {s}\\n", .{@errorName(err)});– Mostramos el mensaje del error.
Ejemplo 2: Parseando números con prefijos de base
Aquí mostramos cómo analizar un número hexadecimal, binario y octal.
const std = @import("std");
pub fn main() !void {
// Cadena hexadecimal (0x)
const hex = "0x1A3F";
const hexVal = try std.fmt.parseInt(u16, hex);
std.debug.print("Hexadecimal 0x1A3F a u16: {x}\\n", .{hexVal});
// Cadena binaria (0b)
const bin = "0b101010";
const binVal = try std.fmt.parseInt(i8, bin);
std.debug.print("Binario 0b101010 a i8: {d}\\n", .{binVal});
// Cadena octal (0o)
const oct = "0o755";
const octVal = try std.fmt.parseInt(u
