Каков правильный способ преобразования char
в int
?
Это дает 49
:
int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works
Я не хочу конвертировать в строку и затем анализировать ее.
Каков правильный способ преобразования 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();
То, что все пугают, объясняет, ПОЧЕМУ это происходит.
A Char, в основном целое число, но с указателем в таблице ASCII. Все символы имеют соответствующее целочисленное значение, как вы можете видеть при попытке его разбора.
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,...)