Tengo un char en c#:

char foo = '2';

Ahora quiero conseguir el 2 en un int. Me parece que Convertir.ToInt32 devuelve el real valor decimal de los char y no con el número 2. El siguiente trabajo:

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

int.analizar sólo funciona en las cadenas también.

No hay una función nativa en C# para ir de un char a int sin hacer de ello una cadena de caracteres? Sé que esto es trivial, pero parece extraño que no hay nada nativa para directamente hacer la conversión.

InformationsquelleAutor KeithA | 2008-10-27

14 Comentarios

  1. 120

    Respuestas interesantes, pero los médicos dicen de manera diferente:

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

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

    • ahh! así que no es algo nativo! Extraño que devuelve un double. Me gusta esta respuesta mejor. Gracias por señalándolo.
    • Hay una razón para que vuelva doble: char.GetNumericValue('¼') los rendimientos de 0.25. Las alegrías de Unicode… 😉
    • Esta no es una respuesta que responde a la pregunta, Char.GetNumericValue(‘o’), Char.GetNumericValue(‘w’) y no numéricos char siempre devolverá -1 – Jeremy Ruten ha publicado la respuesta correcta
    • en el caso de la pregunta original – preguntar específicamente donde sabe que el char representa un número – esto es la respuesta correcta
    • Yo no lo creo – la pregunta original pide char a int sin usar string primera.
  2. 142

    Este va a convertir a int:

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

    Esto funciona porque cada personaje es internamente representado 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’ resultados en el número 2.

    • Lo que es más importante, ¿por qué fue abajo-votó?
    • Funciona porque 0 es de 48.
    • Downvoting porque sólo puedo ver el mecanismo, no la intención.
    • Se supone que un cierto conjunto de caracteres.
    • No no, mientras los dígitos están en orden (que los compiladores requieren de el juego de caracteres) que va a trabajar, no importa lo que el valor que empezar.
    • Esto está muy bien, excepto que usted todavía tiene que hacer la comprobación de límites de primera, y en ese punto no estoy seguro de si int.parse(foo.ToString()) es más rápido.
    • Agradable poco pequeño hack!
    • Pero eso es una suposición segura en C#: char es siempre la codificación UTF-16.
    • Esto funciona para las letras demasiado… así que se podría hacer: char foo = ‘b’; int bar = foo – ‘a’; // ahora puedes ver que ‘bar’ es la 2ª carta (índice 1) en el alfabeto.
    • punto pequeño y viejo, pero en el tiempo desde que se publicó este hemos tenido Núcleo de salir, que utiliza la codificación UTF-8. Todavía una suposición segura, aunque.
    • Eso no es cierto, char en .Net Core es todavía UTF-16. no Hay trabajo que se hace para agregar cadena UTF-8 en una versión futura .Net Core, pero incluso eso no va a cambiar char.
    • Simplemente wow … más impresionante. Y he estado trabajando con char conjuntos de todo el día con fuertes conversiones a int / uint decimal (es decir, numérico) los valores, mayor que / menor que comparisions, etc, pero nunca pensé que de esta sencilla pero brillante manera.

  3. 71

    Alguien ha considerado el uso de int.Parse() y int.TryParse() como este

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

    Aún mejor como esta

    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

    • Absolutamente el enfoque correcto. Elegir la primera, si quieres no-int entradas para lanzar, en el segundo, si quieres hacer algo más.
    • Este es un buen enfoque para un genérico método de conversión. Como un aparte, es otro ejemplo de cómo .NET promueve peyorativa. (Me refiero a ir en y prueba unitaria TryParse() y ToString() – no se puede, no en la práctica).
    • no, es un ejemplo de cómo una respuesta de StackOverflow promueve peyorativa. Este es de hecho innecesariamente hinchado, y no entiendo por qué se considera que esta es superior a la de restar '0' desde el char.
  4. 27
    char c = '1';
    int i = (int)(c-'0');

    y puede crear un método estático de ella:

    static int ToInt(this char c)
    {
        return (int)(c - '0');
    }
    • Esto es lo que yo estaba buscando. Usted tal vez podría explicar lo que están haciendo con el menos cero parte.
  5. 8

    Probar Este

    char x = '9'; //'9' = ASCII 57
    
    int b = x - '0'; //That is '9' - '0' = 57 - 48 = 9
    • Tu comentario dice '9', pero el código ha 9, que no se compilará.
  6. 7

    Por defecto utiliza UNICODE, así que sugiero el uso defectuoso del método

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

    Aunque los valores numéricos en la misma para dígitos y latino básico chars.

  7. 2

    Principio:

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

    El binario del ASCII charecters 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 se toma en cada uno de ellos los primeros 4 LSB (bit a bit mediante Y con 8’b00001111 que equivale a 15), se obtiene el número real (0000 = 0,0001=1,0010=2,… )

    Uso:

    public static int CharToInt(char c)
    {
        return 0b0000_1111 & (byte) c;
    }
    • Mientras este fragmento de código puede ser la solución, incluyendo una explicación realmente ayuda a mejorar la calidad de tu post. Recuerde que usted está respondiendo a la pregunta para los lectores en el futuro, y esas personas pueden no saber las razones de su sugerencia de código.
  8. 1

    El camino real es:

    int theNameOfYourInt = (int).Char.GetNumericValue(theNameOfYourChar);

    «theNameOfYourInt» – int que usted quiere que su char a ser transformados.

    «theNameOfYourChar» – El carácter que desea utilizar de manera que será transformado en un int.

    Dejar todo lo demás de ser.

  9. 0

    La comparación de algunos de los métodos basados en el resultado cuando el personaje no es un ASCII del dígito:

    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 
  10. 0

    Estoy usando Compact Framework 3.5, y no tiene un «char.Analizar el método».
    Creo que no es malo el uso de 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);

    Trabaja con ASCII char o Unicode char

  11. 0

    Estoy de acuerdo con @Chad Subvención

    También a la derecha si se convierte a cadena, a continuación, puede utilizar el valor numérico como se dijo en la pregunta

    int bar = Convert.ToInt32(new string(foo, 1)); //=> gives bar=2

    Traté de crear un mundo más simple y comprensible ejemplo

    char v = '1';
    int vv = (int)char.GetNumericValue(v); 

    char.GetNumericValue(v) devuelve doble y conversos (int)

    Más Advenced uso como una matriz

    int[] values = "41234".ToArray().Select(c=> (int)char.GetNumericValue(c)).ToArray();
  12. -4

    He visto muchas respuestas, pero parece confuso para mí. No podemos simplemente usar de conversión de Tipo.

    Por ejemplo:-

    int s;
    char i= '2';
    s = (int) i;
    • Se devuelve el código ASCII del carácter 2, no el valor de 2.
    • Entonces cómo sobre el uso de char.GetNumericValue (devuelve un valor double) y de fundición a int.
    • Sí, eso es lo @Chad Grant aceptó responder propone
  13. -5

    Esto funcionó para mí:

    int bar = int.Parse("" + foo);
    • Cómo es diferente de int.Parse(foo.ToString()), excepto por ser menos legible?

Dejar respuesta

Please enter your comment!
Please enter your name here