Вопрос
У меня есть символ в С#:
char foo = '2';
Теперь я хочу получить 2 в int.Я обнаружил, что Convert.ToInt32 возвращает фактическое десятичное значение символа, а не число 2.Будет работать следующее:
int bar = Convert.ToInt32(new string(foo, 1));
int.parse также работает только со строками.
Нет ли в C# встроенной функции для перехода от char к int, не превращая его в строку?Я знаю, что это тривиально, но кажется странным, что нет ничего встроенного для прямого преобразования.
Решение
Интересные ответы, но в документах говорится по-другому:
Используйте методы
GetNumericValue
для преобразовать объектChar
, который представляет число в числовой тип значения. использованиеParse
иTryParse
для преобразования символ в строке вChar
объект. ИспользуйтеToString
для преобразованияChar
объект объектаString
.
http://msdn.microsoft.com/en-us/ библиотека / system.char.aspx
Другие советы
Это преобразует его в 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, поэтому я предлагаю использовать метод с ошибками
int bar = int.Parse (foo.ToString ());
Даже если числовые значения одинаковы для цифр и букв латинского алфавита.
Это преобразуется в целое число и обрабатывает Юникод.
CharUnicodeInfo.GetDecimalDigitValue('2')
Вы можете прочитать больше здесь.
Реальный способ:
int theNameOfYourInt = (int).Char.GetNumericValue(theNameOfYourChar);
«theNameOfYourInt» — целое число, в которое вы хотите преобразовать свой символ.
«theNameOfYourChar» — символ, который вы хотите использовать, чтобы он был преобразован в целое число.
Оставьте все остальное как есть.
Принцип:
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;
}
Сравнение некоторых методов на основе результата, когда символ не является цифрой ASCII:
char c = '\n';
Debug.Print(<*>quot;{c & 15}"); // 10
Debug.Print(<*>quot;{c ^ 48}"); // 58
Debug.Print(<*>quot;{c - 48}"); // -38
Debug.Print(<*>quot;{(uint)c - 48}"); // 4294967258
Debug.Print(<*>quot;{char.GetNumericValue(c)}"); // -1
Я использую 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
Я согласен с @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)
Более расширенное использование в качестве массива
int[] values = "41234".ToArray().Select(c=> (int)char.GetNumericValue(c)).ToArray();
Я видел много ответов, но они кажутся мне запутанными. Разве мы не можем просто использовать Type Casting.
Например: -
int s;
char i= '2';
s = (int) i;
Это сработало для меня:
int bar = int.Parse("" + foo);