Как перевести строку в число — int.Parse и TryParse
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!int.Parse(s)— строка вint; так жеlong.Parse,double.Parse,decimal.Parse.Convert.ToInt32(s)— почти то же самое, но дляnullвозвращает 0, а не ошибку.x.ToString()— число в строку; в интерполяции$"{x}"это происходит само.
Если в строке может быть не число — TryParse
int.Parse("abc") останавливает программу ошибкой FormatException (в .NET 8 и 10 сообщение вида The input string 'abc' was not in a correct format.), а слишком большое число — ошибкой OverflowException. Когда строку набирает человек, надёжнее int.TryParse: он не бросает ошибку, а возвращает true или false, само число кладёт в out-переменную.
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 — не число. Так проверяют ввод с клавиатуры:
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" — ошибка. В английской — наоборот. Чтобы программа работала одинаково везде, настройки указывают явно:
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
FalseCultureInfo.InvariantCulture — «нейтральные» настройки с точкой. Обратите внимание на третью строку: в них запятая считается разделителем тысяч, и "2,5" молча превращается в 25. Если человек может набрать и так, и так, замените запятую на точку перед разбором:
using System.Globalization;
string text = (Console.ReadLine() ?? "").Replace(',', '.');
if (double.TryParse(text, NumberStyles.Float, CultureInfo.InvariantCulture, out double x))
{
Console.WriteLine(x * 2);
}Подводные камни
int.Parse("3.5")иint.Parse("3,5")— ошибка: в целом числе не может быть дробной части. Сначалаdouble.Parse, потом округление (справка Как округлить число).- Символ-цифра
'7'— не число 7. Число даёт'7' - '0'илиchar.GetNumericValue('7'), а(int)'7'— это код символа, 55. int.Parseс переполнением даётOverflowException, а неFormatException. Для больших чисел —long.Parse.- В старом .NET Framework сообщение было по-русски: «Входная строка имела неверный формат».