Перетворити char в int в C #


148

У мене є char в c #:

char foo = '2';

Тепер я хочу отримати 2 в int. Я вважаю, що Convert.ToInt32 повертає фактичне десяткове значення символу char, а не число 2. Працює наступне:

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

int.parse також працює лише на рядках.

Чи немає в C # вродженої функції переходити від char до int, не роблячи її рядком? Я знаю, що це банально, але здається дивним, що немає нічого рідного, щоб безпосередньо зробити перетворення.

Відповіді:


143

Цікаві відповіді, але документи говорять інакше:

Використовуйте GetNumericValueметоди для перетворення Charоб'єкта, який представляє число, у тип числового значення. Використовуйте Parseта TryParseперетворюйте символ у рядку в Char об'єкт. Використовуйте ToStringдля перетворення Char об'єкта в Stringоб'єкт.

http://msdn.microsoft.com/en-us/library/system.char.aspx


ах! значить, є щось рідне! Як не дивно, що він повертає дубль. Мені подобається ця відповідь краще. Дякуємо, що вказали на це.
KeithA

92
@KeithA: Є причина, щоб він повернувся вдвічі: char.GetNumericValue('¼')приносить 0,25. Радості Unicode ... ;-)
Хайнзі

1
Це не відповідь, яка відповідає на власне запитання, Char.GetNumericValue ('o'), Char.GetNumericValue ('w') і будь-яка нечислова цифра завжди повертаються -1 - Джеремі Рутен опублікував правильну відповідь
Іржавий ніготь

2
@RustyNail у випадку первинного запитання - запитання конкретно, де він значить, що символом є число - це правильна відповідь
Дон Чедл

@mmcrae Я не думаю - оригінальний питання просить , charщоб intбез використання stringпершого.
NetMage

163

Це перетворить його в int:

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

Це працює, тому що кожен символ внутрішньо представлений цифрою. Символи '0' до '9' представлені послідовними числами, тому знаходження різниці між символами '0' і '2' призводить до числа 2.


5
Він передбачає певний набір символів.
EricSchaefer

8
Ні, це не відбувається, якщо цифри в порядку (які компілятори вимагають від шаблону), вони будуть працювати, незалежно від того, яке значення вони починають.
Джеремі Рутен

2
Це добре, за винятком того, що вам все-таки потрібно виконати перевірку меж спочатку, і в цей момент я не впевнений, чи швидше int.parse (foo.ToString ()).
Меттью Флашен

7
@EricSchaefer Але це безпечне припущення в C #: charзавжди UTF-16.
svick

2
@svick малий момент і старий зараз, але з часу, коли ви опублікували це, у нас вийшов Core, який використовує UTF-8. Але все-таки безпечне припущення.
Joel Coehoorn

84

Хто-небудь думав використовувати 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
}

Це набагато безпечніше і менш схильне до помилок


2
Абсолютно правильний підхід. Виберіть перший, якщо ви хочете, щоб кидали не-int входи, другий, якщо ви хочете зробити щось інше.
Джей Базузі

Це хороший підхід для загального методу перетворення. Крім іншого, це ще один приклад того, як .NET просуває програмне забезпечення. (Я маю на увазі, продовжуйте і тестуйте блок TryParse () і ToString () - ви не можете, не практично).
вихід

5
@logout ні, це приклад того, як відповідь на StackOverflow просуває програмне забезпечення. Це справді непотрібно роздуто, і я не розумію, чому це вважається кращим, ніж віднімання '0'від знака.
Роман Старков

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

і ви можете створити з нього статичний метод:

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

Це те, що я шукав. Ви можете, можливо, пояснити, що ви робите з мінусовою частиною.
Xonatron

10

Спробуйте це

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

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

Ваш коментар говорить '9', але ваш код має 9, який не збирається.
svick

7

За замовчуванням ви використовуєте UNICODE, тому я пропоную використовувати метод несправності

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

Незважаючи на те, що числові значення нижче однакові для цифр та основних латинських знаків.


4

Це перетворюється на ціле число і обробляє unicode

CharUnicodeInfo.GetDecimalDigitValue('2')

Більше ви можете прочитати тут .


4

Реальний спосіб:

int theNameOfYourInt = (int) .Char.GetNumericValue (theNameOfYourChar);

"theNameOfYourInt" - внутрішній вигляд, в який ви хочете перетворити вашу таблицю.

"theNameOfYourChar" - Char, яку ви хочете використовувати, тому він буде перетворений на int.

Залиште все інше.


2

Принцип:

char foo = '2';
int bar = foo & 15;

Двійковий код діаграм ASCII 0-9:

0   -   0011 0000
1   -   0011 0001
2   -   0011 0010
3   -   0011 0011
4   -   0011 0100
5   -   0011 0101
6   -   0011 0110
7   -   0011 0111
8   -   0011 1000
9   -   0011 1001

і якщо ви візьмете в кожному з них перші 4 LSB (використовуючи побітові AND з 8'b00001111, що дорівнює 15), ви отримаєте фактичне число (0000 = 0,0001 = 1,0010 = 2, ...)

Використання:

public static int CharToInt(char c)
{
    return 0b0000_1111 & (byte) c;
}

2
Хоча цей фрагмент коду може бути вирішенням, зокрема пояснення дійсно допомагає покращити якість вашої публікації. Пам'ятайте, що ви відповідаєте на запитання читачів у майбутньому, і ці люди можуть не знати причини вашої пропозиції щодо коду.
іві

2

Я згоден з @Chad Grant

Також правильно, якщо ви перетворюєте на рядок, ви можете використовувати це значення як числове, як сказано в питанні

int bar = Convert.ToInt32(new string(foo, 1)); // => gives bar=2

Я спробував створити більш простий і зрозумілий приклад

char v = '1';
int vv = (int)char.GetNumericValue(v); 

char.GetNumericValue (v) повертається як подвійний і перетворюється в (int)

Більш розширене використання як масив

int[] values = "41234".ToArray().Select(c=> (int)char.GetNumericValue(c)).ToArray();

0

Порівняння деяких методів на основі результату, коли символ не є цифрою 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 

0

Я використовую Compact Framework 3.5 і не має методу "char.Parse". Я думаю, що непогано використовувати клас Convert. (Див. CLR через C #, Джеффрі Ріхтер)

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 або Unicode


-4

Це працювало для мене:

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

5
Чим це відрізняється int.Parse(foo.ToString()), за винятком того, що він менш читабельний?
svick

-5

Я бачив багато відповідей, але вони здаються мені заплутаними. Чи не можемо ми просто використовувати кастинг типів?

Наприклад: -

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

1
Це поверне ASCII код символу 2, а не значення 2.
cavpollo

Тоді як щодо використання char.GetNumericValue (Він повертає подвійне значення) та перенесення його до int.
Учень

Так, ось що пропонує прийнята відповідь @Chad Grant
cavpollo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.