net - int.parse c#
Cadena binaria a entero (2)
Gracias por la gran e increíblemente rápida respuesta!
Lamentablemente mis necesidades cambiaron. Ahora el usuario puede ingresar prácticamente cualquier formato. Binario, Decimal, Hex. Así que decidí intentarlo: catch solo proporciona la solución más simple y limpia.
Así que, por si acaso, estoy publicando el código que estoy usando ahora. Creo que es bastante claro e incluso algo elegante, o eso creo ^^.
switch (format)
{
case VariableFormat.Binary:
try
{
result = Convert.ToInt64(value, 2)
}
catch
{
// error handling
}
break;
case VariableFormat.Decimal:
try
{
result = Convert.ToInt64(value, 10)
}
catch
{
// error handling
}
break;
case VariableFormat.Hexadecimal:
try
{
result = Convert.ToInt64(value, 16)
}
catch
{
// error handling
}
break;
}
Así que gracias por animarme a usar try - catch, creo que realmente mejoró la legibilidad de mi código.
Gracias
Tengo una cadena binaria, ingresada por el usuario, que necesito convertir a un entero.
Al principio usé ingenuamente esta simple línea:
Convert.ToInt32("11011",2);
Desafortunadamente, esto produce una excepción si el usuario ingresa el número entero directamente.
Convert.ToInt32("123",2); // throws Exception
¿Cómo puedo asegurarme de que la cadena introducida por el usuario sea realmente una cadena binaria?
- Intenta ... captura ... pero eso es demasiado feo.
- algo así como ''Int32.TryParse'' tal vez.
Gracias
Podría usar un Regex
para verificar que es "^ [01] + $" (o mejor, "^ [01] {1,32} $"), y luego usar Convert
?
Por supuesto, las excepciones probablemente no sean un gran problema de todos modos. ¿Poco elegante? tal vez. Pero funcionan.
Ejemplo (formateado para espacio vertical):
static readonly Regex binary = new Regex("^[01]{1,32}$", RegexOptions.Compiled);
static void Main() {
Test("");
Test("01101");
Test("123");
Test("0110101101010110101010101010001010100011010100101010");
}
static void Test(string s) {
if (binary.IsMatch(s)) {
Console.WriteLine(Convert.ToInt32(s, 2));
} else {
Console.WriteLine("invalid: " + s);
}
}