В массив записывается не то число C#

Весь код прикреплен. Суть его в том, что считывается 5тизначное число, и записывается в массив int. При вводе числа 12345 в массив записывается 49, 50, 51, 52, 53. Я уже пробовал дебажить, до записи numstr.ElementAt(i) (пробовал и numstr[i]) в arr[i] все нормально, arr[0] равно нулю, как и положено, numstr.ElementAt(i) равен 1, как вводилось, но после операции в 9 строке в массив записывается 49. Откуда оно взялось? Куда делась единица? Почему так получилось?

Весь код я пишу в VSCode и запускаю через .net (т. е. создаю проект командой dotnet new console и т.д. )

Console.Write("Enter your number: ");
int num = Convert.ToInt32(Console.ReadLine());
int[] arr = {0, 0, 0, 0, 0};
string numstr = num.ToString();
Console.WriteLine(num);

for(int i = 0; i < 5; i++)
{
    arr[i] = numstr.ElementAt(i);
}

for(int i = 0; i < 5; i++)
{
    Console.Write(arr[i] + " ");
}

Ответы (1 шт):

Автор решения: 4500zenja

Проблема в том, что Вы считываете символы из строки numstr, а они преобразуются согласно таблице ASCII — символ '1' имеет код 49, '2' — 50 и т.д.

Я предлагаю при занесении в массив преобразовывать получившийся символ в Int при помощи формулы numstr.ElementAt(i) - '0' — в таком случае от кода текущего символа отнимется '0', или 48, и тогда всё будет передано верно.

Console.Write("Enter your number: ");
int num = Convert.ToInt32(Console.ReadLine());
int[] arr = {0, 0, 0, 0, 0};
string numstr = num.ToString();
Console.WriteLine(num);

for(int i = 0; i < 5; i++)
{
    arr[i] = numstr.ElementAt(i) - '0'; // '1' - '0' = 49 - 48 = 1, например
}

for(int i = 0; i < 5; i++)
{
    Console.Write(arr[i] + " ");
}

UPD: ещё вариант без подобных ухищрений — int.Parse(numstr.ElementAt(i).ToString()); — он преобразует символ в строку, а затем получившуюся строку преобразует в число. Про Parse и его особенности можете прочесть здесь.

Ещё один вариант — Char.GetNumericValue(numstr.ElementAt(i))

→ Ссылка