#c# #.net
#c# #char #int
Вопрос:
У меня есть символ в c#:
char foo = '2';
Теперь я хочу получить 2 в int. Я нахожу это преобразование.ToInt32 возвращает фактическое десятичное значение символа, а не число 2. Будет работать следующее:
int bar = Convert.ToInt32(new string(foo, 1));
int.parse также работает только со строками.
Нет ли в C # собственной функции для перехода от char к int, не превращая его в строку? Я знаю, что это тривиально, но просто кажется странным, что нет ничего родного для прямого преобразования.
Ответ №1:
Это преобразует его в int
:
char foo = '2';
int bar = foo - '0';
Это работает, потому что каждый символ внутренне представлен числом. Символы '0'
to '9'
представлены последовательными числами, поэтому поиск разницы между символами '0'
и '2'
приводит к числу 2.
Комментарии:
1. Он предполагает определенный набор символов.
2. Нет, это не так, пока цифры в порядке (которые компиляторы требуют от кодировки), это будет работать, независимо от того, с какого значения они начинаются.
3. Это нормально, за исключением того, что вам все равно нужно сначала выполнить проверку границ, и в этот момент я не уверен, является ли int.parse(foo. toString()) быстрее.
4. @EricSchaefer Но это безопасное предположение в C #:
char
всегда UTF-16.5. @svick сейчас это маленькая точка и старая, но за время, прошедшее с тех пор, как вы опубликовали это, у нас появилось ядро, которое использует UTF-8. Тем не менее, это безопасное предположение.
Ответ №2:
Интересные ответы, но в документах говорится по-другому:
Используйте
GetNumericValue
методы для преобразованияChar
объекта, представляющего число, в числовой тип значения. ИспользуйтеParse
иTryParse
для преобразования символа в строке вChar
объект. ИспользуетсяToString
для преобразованияChar
объекта вString
объект.
Комментарии:
1. ах! так что есть что-то родное! Странно, что он возвращает double . Мне больше нравится этот ответ. Спасибо, что указали на это.
2. @KeithA: есть причина, по которой он возвращает double:
char.GetNumericValue('¼')
дает 0.25. Радости Юникода … 😉3. Это не ответ, который отвечает на фактический вопрос, Char . Получить числовое значение(‘o’), символ. Получите числовое значение (‘w’), и любой нечисловой символ всегда будет возвращать -1 — Джереми Рутен опубликовал правильный ответ
4. @RustyNail в случае исходного вопроса — конкретно спросить, откуда он знает, что символ представляет число — это правильный ответ
5. @mmcrae Я так не думаю — в исходном вопросе запрашивается
char
toint
без использованияstring
first .
Ответ №3:
Кто-нибудь рассматривал возможность использования 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
}
Это намного безопаснее и менее подвержено ошибкам
Комментарии:
1. Абсолютно правильный подход. Выберите первый, если вы хотите, чтобы неинтегрированные входные данные выдавали, второй, если вы хотите сделать что-то еще.
2. Это хороший подход для универсального метода преобразования. Кроме того, это еще один пример того, как .NET продвигает вредоносное ПО. (Я имею в виду продолжить модульное тестирование TryParse() и toString() — вы не можете, практически).
3. @logout нет, это пример того, как ответ на StackOverflow способствует распространению вредоносных программ. Это действительно излишне раздуто, и я не понимаю, почему это считается лучше, чем вычитание
'0'
из символа.
Ответ №4:
char c = '1';
int i = (int)(c - '0');
и вы можете создать из него статический метод:
static int ToInt(this char c)
{
return (int)(c - '0');
}
Комментарии:
1. Это то, что я искал. Возможно, вы могли бы объяснить, что вы делаете с частью минус ноль.
Ответ №5:
Попробуйте это
char x = '9'; // '9' = ASCII 57
int b = x - '0'; //That is '9' - '0' = 57 - 48 = 9
Комментарии:
1. В вашем комментарии сказано
'9'
, но в вашем коде есть9
, который не будет компилироваться.
Ответ №6:
По умолчанию вы используете UNICODE, поэтому я предлагаю использовать метод faultly
int bar = int.Parse(foo.ToString());
Несмотря на то, что числовые значения под одинаковы для цифр и основных латинских символов.
Ответ №7:
Это преобразует в целое число и обрабатывает юникод
CharUnicodeInfo.GetDecimalDigitValue('2')
Вы можете прочитать больше здесь.
Ответ №8:
Реальный способ:
int theNameOfYourInt = (int).Char .Получить числовое значение(имя вашего символа);
«theNameOfYourInt» — значение, в которое вы хотите преобразовать ваш char.
«theNameOfYourChar» — символ, который вы хотите использовать, чтобы он был преобразован в int.
Оставьте все остальное как есть.
Ответ №9:
Принцип:
char foo = '2';
int bar = foo amp; 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 (используя побитовое значение И с 8’b00001111, что равно 15), вы получите фактическое число (0000 = 0,0001=1,0010=2,… )
Использование:
public static int CharToInt(char c)
{
return 0b0000_1111 amp; (byte) c;
}
Комментарии:
1. Хотя этот фрагмент кода может быть решением, включение объяснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос для будущих читателей, и эти люди могут не знать причин вашего предложения по коду.
Ответ №10:
Я согласен с @Chad Grant
Также правильно, если вы преобразуете в строку, тогда вы можете использовать это значение как числовое, как указано в вопросе
int bar = Convert.ToInt32(new string(foo, 1)); // => gives bar=2
Я попытался создать более простой и понятный пример
char v = '1';
int vv = (int)char.GetNumericValue(v);
символ.GetNumericValue(v) возвращает значение double и преобразует в (int)
Более расширенное использование в качестве массива
int[] values = "41234".ToArray().Select(c=> (int)char.GetNumericValue(c)).ToArray();
Ответ №11:
Сначала преобразуйте символ в строку, а затем преобразуйте в целое число.
var character = '1';
var integerValue = int.Parse(character.ToString());
Ответ №12:
Я использую Compact Framework 3.5 и не имеет «символа.Метод «Разбора». Я думаю, что неплохо использовать класс 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
Ответ №13:
Сравнение некоторых методов на основе результата, когда символ не является цифрой ASCII:
char c1 = (char)('0' - 1), c2 = (char)('9' 1);
Debug.Print($"{c1 amp; 15}, {c2 amp; 15}"); // 15, 10
Debug.Print($"{c1 ^ '0'}, {c2 ^ '0'}"); // 31, 10
Debug.Print($"{c1 - '0'}, {c2 - '0'}"); // -1, 10
Debug.Print($"{(uint)c1 - '0'}, {(uint)c2 - '0'}"); // 4294967295, 10
Debug.Print($"{char.GetNumericValue(c1)}, {char.GetNumericValue(c2)}"); // -1, -1
Ответ №14:
Используйте это:
public static string NormalizeNumbers(this string text)
{
if (string.IsNullOrWhiteSpace(text)) return text;
string normalized = text;
char[] allNumbers = text.Where(char.IsNumber).Distinct().ToArray();
foreach (char ch in allNumbers)
{
char equalNumber = char.Parse(char.GetNumericValue(ch).ToString("N0"));
normalized = normalized.Replace(ch, equalNumber);
}
return normalized;
}
Ответ №15:
Один очень быстрый и простой способ просто преобразовать символы 0-9 в целые числа: C # обрабатывает значение char очень похоже на целое число.
char c = ‘7’; (ascii-код 55) int x = c — 48; (результат = целое число из 7)
Ответ №16:
Используйте Uri.FromHex.
И, чтобы избежать исключений, Uri.IsHexDigit.
char testChar = 'e';
int result = Uri.IsHexDigit(testChar)
? Uri.FromHex(testChar)
: -1;
Ответ №17:
Я искал наиболее оптимизированный метод и был очень удивлен, что лучший — самый простой (и самый популярный ответ):
public static int ToIntT(this char c) =>
c is >= '0' and <= '9'?
c-'0' : -1;
Там список методов, которые я пробовал:
c-'0' //current
switch //about 25% slower, no method with disabled isnum check (it is but performance is same as with enabled)
0b0000_1111 amp; (byte) c; //same speed
Uri.FromHex(c) /*2 times slower; about 20% slower if use my isnum check*/ (c is >= '0' and <= '9') /*instead of*/ Uri.IsHexDigit(testChar)
(int)char.GetNumericValue(c); // about 20% slower. I expected it will be much more slower.
Convert.ToInt32(new string(c, 1)) //3-4 times slower
Обратите внимание, что проверка isnum (2-я строка в первом кодовом блоке) занимает ~ 30% производительности, поэтому вам следует снять ее, если вы уверены, что c
это char. Ошибка тестирования составила ~ 5%
Ответ №18:
Это сработало для меня:
int bar = int.Parse("" foo);
Комментарии:
1. Чем это отличается от
int.Parse(foo.ToString())
, за исключением того, что оно менее читабельно?
Ответ №19:
Я видел много ответов, но они кажутся мне запутанными. Разве мы не можем просто использовать приведение типов.
Например:-
int s;
char i= '2';
s = (int) i;
Комментарии:
1. Это вернет ASCII-код символа 2, а не значение 2.
2. Тогда как насчет использования char. Получите числовое значение (оно возвращает двойное значение) и преобразуйте его в int.
3. Да, это то, что предлагает принятый ответ @Chad Grant
4. это было на самом деле то, что я искал, когда нашел этот стек