Конвертировать char в int в C #

149

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

char foo = '2';

Теперь я хочу получить 2 в Int. Я считаю, что Convert.ToInt32 возвращает действительное десятичное значение символа, а не число 2. Следующее будет работать:

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

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

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

KeithA
источник

Ответы:

144

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

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

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

Чад Грант
источник
ааа! так что есть что то родное! Странно, что он возвращает двойной. Мне больше нравится этот ответ. Спасибо за указание на это.
KeithA
92
@KeithA: есть причина, по которой он должен возвращать double: char.GetNumericValue('¼')доходность 0,25. Радости Unicode ... ;-)
Хайнци
1
Это не ответ, который отвечает на фактический вопрос, Char.GetNumericValue ('o'), Char.GetNumericValue ('w'), и любой не числовой символ всегда будет возвращать -1 - Джереми Рутен опубликовал правильный ответ
Rusty Nail
2
@RustyNail в случае исходного вопроса - конкретно спрашивая, откуда он знает, что символ представляет число - это правильный ответ
Дон Чидл
@mmcrae Я не думаю - оригинальный вопрос просит , charчтобы intбез использования stringпервого.
NetMage
164

Это преобразует его в 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. Тем не менее, безопасное предположение.
Джоэл Коухорн
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 no, это пример того, как ответ на StackOverflow продвигает вредоносные программы. Это действительно излишне раздутый, и я не понимаю, почему это считается лучше, чем вычитать '0'из символа.
Роман Старков
26
char c = '1';
int i = (int)(c-'0');

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

static int ToInt(this char c)
{
    return (int)(c - '0');
}
SONTEK
источник
Это то, что я искал. Вы могли бы объяснить, что вы делаете с минус нулевой частью.
Ксонатрон
10

Попробуй это

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

int b = x - '0'; //That is '9' - '0' = 57 - 48 = 9
RollerCosta
источник
Ваш комментарий говорит '9', но ваш код имеет 9, который не будет компилироваться.
svick
7

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

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

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

Николай
источник
4

Это преобразует в целое число и обрабатывает Unicode

CharUnicodeInfo.GetDecimalDigitValue('2')

Вы можете прочитать больше здесь .

Дэн Фридман
источник
4

Настоящий путь это:

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

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

"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 младших бита (используя побитовое И с 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) возвращается как double и конвертируется в (int)

Более Advenced использование в качестве массива

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 
Slai
источник
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

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

Например:

int s;
char i= '2';
s = (int) i;
ученик
источник
1
Это вернет ASCII-код символа 2, а не значение 2.
cavpollo
Тогда как насчет использования char.GetNumericValue (возвращает двойное значение) и приведением его к int.
Ученик
Да, это то, что предлагает принятый ответ @Chad Grant
cavpollo