Перетворити 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.