Який правильний спосіб перетворити 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
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. Усі символи мають відповідне ціле значення, як ви добре бачите при спробі їх розбору.
У Pranay чітко інший набір символів, тому його код не працює. єдиний спосіб
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 (використовуючи побітові AND з 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;
}