Как правильно преобразовать a charв int? Это дает 49:
int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works
Я не хочу преобразовывать в строку, а затем разбирать ее.
Как правильно преобразовать a charв int? Это дает 49:
int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works
Я не хочу преобразовывать в строку, а затем разбирать ее.
Ответы:
Я удивлен, что никто не упомянул статический метод, встроенный прямо в System.Char...
int val = (int)Char.GetNumericValue('8');
// val == 8
double, хотя
Char.GetNumericValue('⅓')действительно возвращается 0.3333.... Спасибо что подметил это!
как насчет (для 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();
int.Parseто, что исключение выбрасывается при недопустимом вводе, вам нужно будет добавить дополнительную проверку границ:if (i < 0 || i > 9) throw new FormatException();
Все забывают объяснить, ПОЧЕМУ это происходит.
Char - это целое число, но с указателем в таблице ASCII. Все символы имеют соответствующее целочисленное значение, как вы можете ясно видеть при его анализе.
У праная явно другой набор символов, поэтому ЕГО код не работает. единственный способ это
int val = '1' - '0';
потому что это ищет целочисленное значение в таблице, '0'которое затем является «базовым значением», вычитая из него ваше число в формате char, вы получите исходное число.
Вы можете использовать следующий метод расширения:
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';
}
}
charв, intмы должны проверять диапазон входного параметра, а не выходного intзначения.
intзначение результата, потому что диапазон числовых символов был выполнен в начале метода, поэтому будет правильное результирующее значение, если указанный символ не находится в диапазоне числовых символов, будет выброшено исключение. Та же логика, что и вы, но проверка диапазона выполняется в начале метода.
if (c < 0 || c > 9)...
Самый безопасный способ добиться этого - использовать метод Int32.TryParse. Смотрите здесь: http://dotnetperls.com/int-tryparse
int val = '1' & 15;
Двоичный код символов ASCII 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, ...)
Расширение некоторых других ответов, охватывающих шестнадцатеричное представление:
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;
}