Преобразование char в int в C#

у меня есть символ в C#:

char foo = '2';

теперь я хочу получить 2 в int. Я нахожу это обращение.ToInt32 возвращает фактическое десятичное значение символа, а не число 2. Будет работать следующее:

int bar = Convert.ToInt32(new string(foo, 1));

int.parse работает только со строками.

нет ли собственной функции в C#, чтобы перейти от символа к int, не делая его строкой? Я знаю, что это тривиально, но кажется странным, что нет ничего родного, чтобы напрямую сделать преобразование.

13 ответов


интересные ответы, но документы говорят по-другому:

использовать GetNumericValue методы преобразовать Char объект, который представляет число для типа числового значения. Использовать Parse и TryParse для преобразования a символ в строке в Char объект. Использовать ToString преобразование Char объекта


это преобразует его в int:

char foo = '2';
int bar = foo - '0';

это работает, потому что каждый символ внутренне представлен числом. Символы от " 0 " до " 9 "представлены последовательными числами, поэтому поиск разницы между символами" 0 " и " 2 " приводит к числу 2.


кто-нибудь рассматривал возможность использования int.Parse() и int.TryParse() такой

int bar = int.Parse(foo.ToString());

еще лучше, как это

int bar;
if (!int.TryParse(foo.ToString(), out bar))
{
    //Do something to correct the problem
}

это намного безопаснее и менее подвержен ошибкам


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

и вы можете создать статический метод из этого:

static int ToInt(this char c)
{
    return (int)(c - '0');
}

Попробуй Такое

char x = '9'; // '9' = ASCII 57

int b = x - '0'; //That is '9' - '0' = 57 - 48 = 9

по умолчанию вы используете UNICODE, поэтому я предлагаю использовать метод faulty

int bar = int.Parse(foo.ToString());

даже если числовые значения под одинаковы для цифр и основных латинских символов.


это преобразуется в целое число и обрабатывает unicode

CharUnicodeInfo.GetDecimalDigitValue('2')

вы можете подробнее здесь.


char foo = '2';
int bar = foo & 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,... )


реальный способ является:

int theNameOfYourInt = (int).Пеструшка.GetNumericValue (theNameOfYourChar);

"theNameOfYourInt" - int, в который вы хотите преобразовать свой символ.

"theNameOfYourChar" - символ, который вы хотите использовать, чтобы он был преобразован в int.

оставьте все остальное.


сравнение некоторых методов на основе результата, когда символ не является цифрой ASCII:

char c = '\n';                              
Debug.Print($"{c & 15}");                   // 10
Debug.Print($"{c ^ 48}");                   // 58
Debug.Print($"{c - 48}");                   // -38
Debug.Print($"{(uint)c - 48}");             // 4294967258
Debug.Print($"{char.GetNumericValue(c)}");  // -1 

Я использую Compact Framework 3.5, и не имеет " char.Метод "разбора". Я думаю, неплохо использовать класс Convert. (См. CLR via C#, Jeffrey Richter)

char letterA = Convert.ToChar(65);
Console.WriteLine(letterA);
letterA = 'あ';
ushort valueA = Convert.ToUInt16(letterA);
Console.WriteLine(valueA);
char japaneseA = Convert.ToChar(valueA);
Console.WriteLine(japaneseA);

работает с ASCII char или Unicode char


это сработало для меня:

int bar = int.Parse("" + foo);

Я видел много ответов, но они, кажется, путаешь меня. Мы не можем просто использовать приведение типов.

например:-

int s;
char i= '2';
s = (int) i;