Преобразовать char в int в C#

#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 объект.

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

Комментарии:

1. ах! так что есть что-то родное! Странно, что он возвращает double . Мне больше нравится этот ответ. Спасибо, что указали на это.

2. @KeithA: есть причина, по которой он возвращает double: char.GetNumericValue('¼') дает 0.25. Радости Юникода … 😉

3. Это не ответ, который отвечает на фактический вопрос, Char . Получить числовое значение(‘o’), символ. Получите числовое значение (‘w’), и любой нечисловой символ всегда будет возвращать -1 — Джереми Рутен опубликовал правильный ответ

4. @RustyNail в случае исходного вопроса — конкретно спросить, откуда он знает, что символ представляет число — это правильный ответ

5. @mmcrae Я так не думаю — в исходном вопросе запрашивается char to int без использования 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. это было на самом деле то, что я искал, когда нашел этот стек