Глиф Учебники

Как перевести строку в число — int.Parse и TryParse

Справочник · C# · 2 минуты чтения

C#
string s = "123";
int n = int.Parse(s);
Console.WriteLine(n + 1);

long big = long.Parse("9000000000");
Console.WriteLine(big / 1000);

int m = Convert.ToInt32("42");
Console.WriteLine(m * 2);

string back = n.ToString();
Console.WriteLine(back + "!");
Вывод
124
9000000
84
123!

Если в строке может быть не число — TryParse

int.Parse("abc") останавливает программу ошибкой FormatException (в .NET 8 и 10 сообщение вида The input string 'abc' was not in a correct format.), а слишком большое число — ошибкой OverflowException. Когда строку набирает человек, надёжнее int.TryParse: он не бросает ошибку, а возвращает true или false, само число кладёт в out-переменную.

C#
string[] inputs = { "15", "привет", "", "99999999999", " 7 " };
foreach (string text in inputs)
{
    if (int.TryParse(text, out int value))
    {
        Console.WriteLine($"«{text}» → {value}");
    }
    else
    {
        Console.WriteLine($"«{text}» — не число");
    }
}
Вывод
«15» → 15
«привет» — не число
«» — не число
«99999999999» — не число
« 7 » → 7

Пробелы в начале и в конце не мешают, а пустая строка и число больше int.MaxValue — не число. Так проверяют ввод с клавиатуры:

C#
Console.Write("Сколько вам лет? ");
if (int.TryParse(Console.ReadLine(), out int age) && age >= 0)
{
    Console.WriteLine($"Через 10 лет будет {age + 10}");
}
else
{
    Console.WriteLine("Нужно целое неотрицательное число");
}

TryParse принимает и null, поэтому Console.ReadLine() можно передать прямо, без ?? "".

Дробные числа: запятая или точка

double.Parse и double.TryParse читают число по региональным настройкам компьютера. В русской или белорусской Windows разделитель — запятая: строка "2,5" читается, а "2.5" — ошибка. В английской — наоборот. Чтобы программа работала одинаково везде, настройки указывают явно:

C#
using System.Globalization;

CultureInfo ru = new CultureInfo("ru-RU");
CultureInfo inv = CultureInfo.InvariantCulture;

Console.WriteLine(double.Parse("2,5", ru) * 2);
Console.WriteLine(double.Parse("2.5", inv) * 2);
Console.WriteLine(double.Parse("2,5", inv) * 2);
Console.WriteLine(double.TryParse("2.5", NumberStyles.Float, ru, out _));
Вывод
5
5
50
False

CultureInfo.InvariantCulture — «нейтральные» настройки с точкой. Обратите внимание на третью строку: в них запятая считается разделителем тысяч, и "2,5" молча превращается в 25. Если человек может набрать и так, и так, замените запятую на точку перед разбором:

C#
using System.Globalization;

string text = (Console.ReadLine() ?? "").Replace(',', '.');
if (double.TryParse(text, NumberStyles.Float, CultureInfo.InvariantCulture, out double x))
{
    Console.WriteLine(x * 2);
}

Подводные камни