¿Cuál es la forma correcta de convertir un chara int? Esto da 49:
int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works
No quiero convertir a cadena y luego analizarlo.
¿Cuál es la forma correcta de convertir un chara int? Esto da 49:
int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works
No quiero convertir a cadena y luego analizarlo.
Respuestas:
Me sorprende que nadie haya mencionado el método estático integrado en System.Char...
int val = (int)Char.GetNumericValue('8');
// val == 8
double, sin embargo
Char.GetNumericValue('⅓')de hecho vuelve 0.3333.... ¡Gracias por señalar eso!
que tal (para char c)
int i = (int)(c - '0');
¿Qué resta del valor de char?
Re la pregunta API (comentarios), ¿quizás un método de extensión?
public static class CharExtensions {
public static int ParseInt32(this char value) {
int i = (int)(value - '0');
if (i < 0 || i > 9) throw new ArgumentOutOfRangeException("value");
return i;
}
}
luego usa int x = c.ParseInt32();
int.Parse, es decir, que se genere una excepción en una entrada no válida, deberá agregar una comprobación de límites adicional:if (i < 0 || i > 9) throw new FormatException();
Lo que todos están olvidando es explicar POR QUÉ sucede esto.
Un Char, es básicamente un número entero, pero con un puntero en la tabla ASCII. Todos los caracteres tienen un valor entero correspondiente como se puede ver claramente al intentar analizarlo.
Pranay tiene claramente un conjunto de caracteres diferente, por eso SU código no funciona. la única forma es
int val = '1' - '0';
porque esto busca el valor entero en la tabla de los '0'cuales es el 'valor base' restando su número en formato char de esto le dará el número original.
Puede usar el siguiente método de extensión:
public static class CharExtensions
{
public static int CharToInt(this char c)
{
if (c < '0' || c > '9')
throw new ArgumentException("The character should be a number", "c");
return c - '0';
}
}
chara inttenemos que comprobar rango del parámetro de entrada, no la salida intde valor.
intvalor del resultado porque el rango de caracteres numéricos se realizó al inicio del método, por lo que habrá un valor resultante correcto, si el carácter especificado no está en el rango de caracteres numéricos, se generará una excepción. La misma lógica que proporcionó, pero la verificación de rango se realiza al comienzo del método.
if (c < 0 || c > 9)...
La forma más segura de lograr esto es utilizando el método Int32. TryParse. Ver aquí: http://dotnetperls.com/int-tryparse
int val = '1' & 15;
El binario de los caracteres ASCII 0-9 es:
0 - 00110000
1 - 00110001
2 - 00110010
3 - 00110011
4 - 00110100
5 - 00110101
6 - 00110110
7 - 00110111
8 - 00111000
9 - 00111001
y si toma en cada uno de ellos los primeros 4 LSB (usando bit a bit Y con 8'b00001111 que equivale a 15) obtendrá el número real (0000 = 0,0001 = 1,0010 = 2, ...)
Una extensión de algunas otras respuestas que cubre la representación hexadecimal:
public int CharToInt(char c)
{
if (c >= '0' && c <= '9')
{
return c - '0';
}
else if (c >= 'a' && c <= 'f')
{
return 10 + c - 'a';
}
else if (c >= 'A' && c <= 'F')
{
return 10 + c - 'A';
}
return -1;
}