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.

¿Fue útil?

Solución

Respuestas interesantes, pero los documentos dicen lo contrario:

  

Utilice los métodos GetNumericValue para   convertir un objeto Char que representa   un número a un tipo de valor numérico. Utilizar    Parse y TryParse para convertir un   carácter en una cadena en un Char   objeto. Utilice ToString para convertir un Char   objeto a un objeto String .

http://msdn.microsoft.com/en-us/ library / system.char.aspx

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top