Как преобразовать char в int?

Каков правильный способ преобразования char в int? Это дает 49:

int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works

Я не хочу конвертировать в строку и затем анализировать ее.

Ответ 1

Я удивлен, что никто не упомянул статический метод, встроенный прямо в System.Char...

int val = (int)Char.GetNumericValue('8');
// val == 8

Ответ 2

как насчет (для char c)

int i = (int)(c - '0');

который выполняет подстановку значения char?

Возникает вопрос API (комментарии), возможно, метод расширения?

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;
    }
}

затем используйте int x = c.ParseInt32();

Ответ 3

То, что все пугают, объясняет, ПОЧЕМУ это происходит.

A Char, в основном целое число, но с указателем в таблице ASCII. Все символы имеют соответствующее целочисленное значение, как вы можете видеть при попытке его разбора.

Pranay имеет явно другой набор символов, поэтому код HIS не работает. единственный способ -

int val = '1' - '0';

потому что это ищет целочисленное значение в таблице '0', которое затем является "базовым значением", вычитая ваш номер в формате char, это даст вам исходный номер.

Ответ 4

int i = (int)char.GetNumericValue(c);

Еще один вариант:

int i = c & 0x0f;

Это также должно быть выполнено.

Ответ 5

int val = '1' - '0';

Это можно сделать с помощью ascii-кодов, где "0" является самым низким, а числовые символы подсчитываются оттуда

Ответ 6

int val = '1' - 48;

Ответ 7

Вы можете использовать следующий метод расширения:

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';
        }
    }

Ответ 8

Самый безопасный способ для этого - использовать метод Int32.TryParse. Глянь сюда: http://dotnetperls.com/int-tryparse

Ответ 9

Расширение некоторых других ответов, которые охватывают шестнадцатеричное представление:

     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;
     }

Ответ 10

Вы можете попробовать что-то вроде этого:

int val = Convert.ToInt32("" + '1');

Ответ 11

int val = '1' & 15;

Бинарный код ASCII charecters 0-9:

0 - 00110000

1 - 00110001

2 - 00110010

3 - 00110011

4 - 00110100

5 - 00110101

6 - 00110110

7 - 00110111

8 - 00111000

9 - 00111001

и если вы берете в каждом из них первые 4 LSB (используя побитовое И с 8'b00001111, что равно 15), вы получаете фактическое число (0000 = 0,0001 = 1,0010 = 2,...)