Як перетворити char в Int?


123

Який правильний спосіб перетворити charна int? Це дає 49:

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

Я не хочу перетворювати на рядок, а потім аналізувати його.


1
Можливий дублікат цього питання.
RBT

Можливий дублікат Convert char в int в C #
GSerg

Відповіді:


282

Я здивований, що ніхто не згадав статичний метод, вбудований прямо в System.Char...

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

18
Гарне місце! +1 Дуже дивно, що він повертає а double,
Марк Гравелл

4
Я згоден, я не можу зрозуміти, чому він повертається "подвійним" - як один символ може представляти число з плаваючою комою?
Джоель Мюллер

49
Є багато символів Unicode, які представляють не ціле число, наприклад, U + 2153 .
dtb

26
@dtb - я не вважав цього. Char.GetNumericValue('⅓')дійсно повертається 0.3333.... Дякуємо, що вказали на це!
Джоель Мюллер

1
Нога Примітка: ця функція наразі недоступна в NetMF.
GisMofx

40

як щодо (для 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();


1
Я мав би сказати, я знав про це, але чи є інший спосіб? Мені хотілося дізнатися, чи існує API для цього?
tvr

4
Якщо ви хочете, щоб поводження було подібним int.Parse, тобто виняток було викинуто на недійсний вхід, вам потрібно буде додати додаткові межі перевірки:if (i < 0 || i > 9) throw new FormatException();
Дірк Волмар

@ user386338 Боюся, що його немає.
Євген Чеверда

@ User386338 - оновлюється з опцією повторного API, також включаючи @ зворотного зв'язку 0xA3 в
Marc Gravell

@ user386338 - див. відповідь Джоеля щодо вбудованого методу API
Марк Гравелл

21

Те, що всі забувають, пояснює, ЧОМУ це відбувається.

Char - це в основному ціле число, але з вказівником у таблиці ASCII. Усі символи мають відповідне ціле значення, як ви добре бачите при спробі їх розбору.

У Pranay чітко інший набір символів, тому його код не працює. єдиний спосіб

int val = '1' - '0';

тому що це шукає ціле значення, в таблиці '0'якого тоді є "базове значення", віднімаючи ваш номер у форматі char, від цього ви отримаєте початкове число.


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

Ще один варіант:

int i = c & 0x0f;

Це також має досягти цього.


4
int val = '1' - '0';

Це можна зробити, використовуючи коди ascii, де '0' найнижчий, а число символів підраховується звідти


Це геніально! Імо найелегантніше рішення тут.
arabisoft

3
int val = '1' - 48;

@Luke Xu: '0' має код ASCII 0x30, що становить 48 в десятковій частині, це те саме, що '1' - '0'
NiKiZe

3

Ви можете використовувати наступний метод розширення:

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

1
@ 0xA3 Перевірка діапазону повинна бути загалом на початку методу. Семантичний , якщо ми хочемо перетворити charдо intнас , щоб перевірити діапазон вхідного параметра, а НЕ вихідна intзначення.
Євген Чеверда

Немає необхідності перевіряти intзначення результату, оскільки діапазон числових знаків був виконаний на початку методу, тому буде правильне отримане значення, якщо вказане значення не знаходиться в діапазоні числових символів, буде викинуто виняток. Та сама логіка, яку ви вказали, але перевірка діапазону виконується на початку методу.
Євген Чеверда

Вибачте, я неправильно читав ваш зразок коду. Іноді важко побачити найочевидніші речі. Б'юсь у заклад, що в коді сказано if (c < 0 || c > 9)...
Дірк Волмар

1

Найбезпечніший спосіб досягти цього - використання методу Int32.TryParse. Дивіться тут: http://dotnetperls.com/int-tryparse


TryParse призначений для рядків, а не для символів
tvr

Так, але це найбільш безпечний спосіб здійснити конверсію
MUG4N

1
Перетворення одного символу в ціле число - питання безпеки?
Джоель Мюллер

1
"Безпечний" у цьому випадку означає, що він не спричинить проблем, якщо ваш char насправді не є числом ascii - це може бути багатобайтовий символ однокодування.
Робін Беннетт

1
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, ...)


Як це працює з точки зору видів? ви використовуєте побітовий оператор між char та int, а потім повертаєте Int? Чи логічне І використовує двійкове представлення як char, так і int і повертає бінарне представлення, а потім, як ви визначаєте var як int, воно використовує це подання?
mitomed

@mitnomed так, і якщо ви, наприклад, використовуєте байт, то він використовує представлення байтів.
Томер Волберг


0

Розширення деяких інших відповідей, які охоплюють шістнадцяткове зображення:

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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.