Pregunta
Tengo un char en c #:
char foo = '2';
Ahora quiero meter el 2 en un int. Encuentro que Convert.ToInt32 devuelve el valor decimal real del char y no el número 2. Lo siguiente funcionará:
int bar = Convert.ToInt32(new string(foo, 1));
int.parse solo funciona en cadenas también.
¿No hay una función nativa en C # para pasar de un char a int sin convertirlo en una cadena? Sé que esto es trivial, pero parece extraño que no haya nada nativo para hacer la conversión directamente.
Solución
Respuestas interesantes, pero los documentos dicen lo contrario:
Utilice los métodos
GetNumericValue
para convertir un objetoChar
que representa un número a un tipo de valor numérico. UtilizarParse
yTryParse
para convertir un carácter en una cadena en unChar
objeto. UtiliceToString
para convertir unChar
objeto a un objetoString
.
Otros consejos
Esto lo convertirá en un int:
char foo = '2';
int bar = foo - '0';
Esto funciona porque cada carácter está representado internamente por un número. Los caracteres '0' a '9' están representados por números consecutivos, por lo que encontrar la diferencia entre los caracteres '0' y '2' da como resultado el número 2.
¿Alguien ha considerado usar int.Parse ()
y int.TryParse ()
como este
int bar = int.Parse(foo.ToString());
Incluso mejor como este
int bar;
if (!int.TryParse(foo.ToString(), out bar))
{
//Do something to correct the problem
}
Es mucho más seguro y menos propenso a errores
char c = '1';
int i = (int)(c-'0');
y puedes crear un método estático a partir de él:
static int ToInt(this char c)
{
return (int)(c - '0');
}
Prueba esto
char x = '9'; // '9' = ASCII 57
int b = x - '0'; //That is '9' - '0' = 57 - 48 = 9
Por defecto, usa UNICODE, por lo que sugiero usar el método de Fault
int bar = int.Parse (foo.ToString ());
A pesar de que los valores numéricos debajo son los mismos para los dígitos y los caracteres latinos básicos.
Esto se convierte en un entero y maneja Unicode
CharUnicodeInfo.GetDecimalDigitValue('2')
Puede leer más aquí .
La forma real es:
int theNameOfYourInt = (int) .Char.GetNumericValue (theNameOfYourChar);
" theNameOfYourInt " - el int al que quieres que se transforme tu personaje.
" theNameOfYourChar " - El Char que quieres usar para que se transforme en un int.
Deja que todo lo demás sea.
Principio:
char foo = '2';
int bar = foo & 15;
El binario de los caracteres ASCII 0-9 es:
0 - 0011 0000
1 - 0011 0001
2 - 0011 0010
3 - 0011 0011
4 - 0011 0100
5 - 0011 0101
6 - 0011 0110
7 - 0011 0111
8 - 0011 1000
9 - 0011 1001
y si toma en cada uno de ellos los primeros 4 LSB (utilizando bitwise AND con 8'b00001111 que es igual a 15) obtendrá el número real (0000 = 0,0001 = 1,0010 = 2, ... )
Uso :
public static int CharToInt(char c)
{
return 0b0000_1111 & (byte) c;
}
Comparación de algunos de los métodos basados ??en el resultado cuando el carácter no es un dígito ASCII:
char c = '\n';
Debug.Print(<*>quot;{c & 15}"); // 10
Debug.Print(<*>quot;{c ^ 48}"); // 58
Debug.Print(<*>quot;{c - 48}"); // -38
Debug.Print(<*>quot;{(uint)c - 48}"); // 4294967258
Debug.Print(<*>quot;{char.GetNumericValue(c)}"); // -1
Estoy usando Compact Framework 3.5 y no tengo un " char.Parse " método. Creo que no es malo usar la clase Convert. (Ver CLR a través de C #, Jeffrey Richter)
char letterA = Convert.ToChar(65);
Console.WriteLine(letterA);
letterA = 'あ';
ushort valueA = Convert.ToUInt16(letterA);
Console.WriteLine(valueA);
char japaneseA = Convert.ToChar(valueA);
Console.WriteLine(japaneseA);
Funciona con caracteres ASCII o caracteres Unicode
Estoy de acuerdo con @Chad Grant
También es correcto si convierte a cadena, entonces puede usar ese valor como numérico como se dice en la pregunta
int bar = Convert.ToInt32(new string(foo, 1)); // => gives bar=2
Intenté crear un ejemplo más simple y comprensible
char v = '1';
int vv = (int)char.GetNumericValue(v);
char.GetNumericValue (v) se devuelve como doble y se convierte en (int)
Más uso advenido como una matriz
int[] values = "41234".ToArray().Select(c=> (int)char.GetNumericValue(c)).ToArray();
He visto muchas respuestas pero me parecen confusas. No podemos simplemente usar Type Casting.
Por ejemplo: -
int s;
char i= '2';
s = (int) i;
Esto me funcionó:
int bar = int.Parse("" + foo);