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

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

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

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

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

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

как насчет (для 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();

То, что все пугают, объясняет, почему это происходит.

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

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

 int val = '1' - '0'; 

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

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

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

 int i = c & 0x0f; 

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

 int val = '1' - '0'; 

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

 int val = '1' - 48; 

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

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

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

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

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

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

 int val = Convert.ToInt32("" + '1'); 
 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, …)

  • Будет ли автоматический вывод типа вывода на главную работу?
  • Встроенные функции против макросов препроцессора
  • Тип одного из выражений в предложении соединения неверен в Entity Framework
  • Программно получить скриншот страницы
  • C # Math calculator
  • Есть ли макрос __CLASS__ в C ++?
  • c ++ быстрый способ читать только последнюю строку текстового файла?
  • Когда следует писать ключевое слово 'inline' для функции / метода?
  • Что такое ObservableCollection в .net?
  • Включение VLA (массивы переменной длины) в MS Visual C ++?
  • Литье одной структуры С в другую
  • Давайте будем гением компьютера.