2008-10-27 21 views
93

Así que tengo un caracter en C#:C# char a int

char foo = '2'; 

Ahora queremos obtener el 2 en un int. Encuentro que Convert.ToInt32 devuelve el valor decimal real del carbón y no el número 2. El siguiente trabajo:

int bar = Convert.ToInt32(new string(foo, 1)); 

int.parse sólo funciona en cadenas, por supuesto.

¿No existe una función nativa en C# para pasar de una char a int sin convertirla en una cadena? Sé que esto es trivial, pero parece extraño que no haya nada nativo para hacer la conversión directamente.

Respuesta

91

respuestas interesantes, pero los documentos dicen de otra manera:

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

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

+0

ahh! entonces hay algo nativo! Es extraño que devuelva un doble. Me gusta esta respuesta mejor. Gracias por mencionarlo. – KeithA

+60

@KeithA: Hay una razón para que regrese doble: 'char.GetNumericValue ('¼')' produce 0.25. Las alegrías de Unicode ... ;-) – Heinzi

+0

Esta no es una respuesta que responda a la pregunta real, Char.GetNumericValue ('o'), Char.GetNumericValue ('w') y cualquier carácter no numérico siempre devolverá -1 - Jeremy Ruten ha publicado la respuesta correcta –

103

Esto lo convertirá en un int:

char foo = '2'; 
int bar = foo - '0'; 

Esto funciona porque cada personaje está internamente representado por un número. El caracteres '0' a '9' están representados por números consecutivos, por lo que encontrar la diferencia entre los caracteres '0' y resultados '2' en el número 2.

+0

Más importante aún, ¿por qué se votó negativamente? –

+0

Funciona porque 0 es 48. – sontek

+3

Downvoting porque solo puedo ver el mecanismo, no intento. –

22
char c = '1'; 
int i = (int)(c-'0'); 

y puede crear un método estático a cabo de la misma:

static int ToInt(this char c) 
{ 
    return (int)(c - '0'); 
} 
58

alguien ha considerado el uso de int.Parse() y int.TryParse() como esto

int bar = int.Parse(foo.ToString()); 

Incluso mejor así

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

+0

Absolutamente el enfoque correcto. Elija la primera si desea que las entradas que no sean de entrada se lancen, la segunda si desea hacer otra cosa. –

+0

Este es un buen enfoque para un método de conversión genérico. Como un aparte, es otro ejemplo de cómo .NET promueve bloatware. (Me refiero a seguir y probar la unidad TryParse() y ToString() - no se puede, no prácticamente). – logout

+4

@logout no, es un ejemplo de cómo una respuesta en StackOverflow promueve bloatware. Esto de hecho es innecesariamente hinchado, y no entiendo por qué esto se considera superior a restar ''0'' del char. –

8

Trate Esta

char x = '9'; // '9' = ASCII 57 

int b = x - '0'; //That is '9' - '0' = 57 - 48 = 9 
+0

Tu comentario dice ''9'', pero tu código ha '9', que no se compilará. – svick

7

Por defecto se utiliza UNICODE por lo que se sugiere emplear el método de defectuosa

int bar = int.Parse(foo.ToString());

A pesar de que los valores numéricos menores son los mismos para dígitos y caracteres latinos básicos.

-5

Esto funcionó para mí:

int bar = int.Parse("" + foo); 
+5

¿Cómo es eso diferente de 'int.Parse (foo.ToString())', excepto por ser menos legible? – svick

2

Esto convierte a entero y se maneja Unicode

CharUnicodeInfo.GetDecimalDigitValue('2')

Puede leer más here.

0

Estoy utilizando Compact Framework 3.5, y no tiene un método "char.Parse". Creo que no está mal 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 carbón ASCII o carbón Unicode

eso es todo

Antonio

0

Comparación de algunos de los métodos basados ​​en el resultado cuando el el carácter no es un dígito ASCII:

char c = '\n';        
Debug.Print($"{c & 15}");     // 10 
Debug.Print($"{c^48}");     // 58 
Debug.Print($"{c - 48}");     // -38 
Debug.Print($"{(uint)c - 48}");    // 4294967258 
Debug.Print($"{char.GetNumericValue(c)}"); // -1 
-3

He visto muchas respuestas s pero me parecen confusos. ¿No podemos simplemente usar Type Casting?

Para ex: -

int s; 
char i= '2'; 
s = (int) i; 
+1

Esto devolvería el código ASCII del carácter 2, no el valor 2. – cavpollo

+0

Entonces, ¿qué hay de usar char.GetNumericValue (Devuelve un valor doble) y convertirlo a int. – Learner

+0

Sí, eso es lo que la respuesta aceptada de @Chad Grant propone – cavpollo

0
char foo = '2'; 
int bar = foo & 15; 

El binaria de los charecters ASCII 0-9 es:

0 - 00110000

1 - 00110001

2 - 00,11001 millón

3 - 00110011

4 - 00110100

5 - 00110101

6 - 00110110

7 - 00110111

8 - 00111000

9 - 00111.001 mil

y si toma en cada uno de ellos los primeros 4 LSB (usando bit Y Y con 8'b00001111 que equels a 15) obtiene el número real (0000 = 0,0001 = 1,0010 = 2, ...)

+2

Si bien este fragmento de código puede ser la solución, [incluye una explicación] (// meta.stackexchange.com/questions/114762/explaining-entirely-código-basado-respuestas) realmente ayuda a mejorar la calidad de tu publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. – yivi

+0

@yivi Gracias por el comentario, agregué una explicación –