Как показать число в TextBox в C# и считать обратно
Чтобы вывести число в TextBox, его нужно превратить в строку и записать в свойство Text. Дальше разобраны форматирование (знаки после запятой, разделители, проценты, валюта), обратное чтение числа из поля через TryParse, ограничение ввода только цифрами и особенности русской локали, которые чаще всего ломают такой код.

Содержание
- Простой вывод: ToString и интерполяция
- Форматирование числа
- Культура: запятая или точка
- Вывод результата вычислений
- Чтение числа из TextBox
- Выбор типа: int, double, decimal
- Ограничение ввода только цифрами
- Вывод массивов и списков чисел
- Показ в реальном времени и из другого потока
- Только для показа: ReadOnly или Label
- Привязка к данным
- Типичные ошибки
- Частые вопросы
Простой вывод: ToString и интерполяция
У TextBox есть свойство Text типа string, и присвоить ему число напрямую нельзя: строка textBox1.Text = 42; не скомпилируется. Достаточно вызвать ToString() либо использовать интерполяцию или конкатенацию.
int count = 42;
double price = 1234.567;
textBox1.Text = count.ToString();
textBox2.Text = price.ToString();
textBox3.Text = $"{count}";
textBox4.Text = "Всего: " + count;
Все четыре способа дают один результат, но у ToString() без параметров есть нюанс: вещественное число записывается в соответствии с региональными настройками Windows. На русской системе вы увидите 1234,567 с запятой, а на английской 1234.567 с точкой. Для интерфейса это обычно то, что нужно, а для записи в файл или обмена данными - нет.
Форматирование числа
Метод ToString принимает строку формата. Она позволяет задать число знаков после запятой, разделители групп разрядов, процент и валюту. Самые полезные спецификаторы собраны в таблице, значения рассчитаны для русской культуры.
| Формат | Пример кода | Результат для 1234.567 |
|---|---|---|
| F2 - фиксированное число знаков | x.ToString("F2") | 1234,57 |
| N2 - с разделителем разрядов | x.ToString("N2") | 1 234,57 |
| N0 - целое с разделителем | x.ToString("N0") | 1 235 |
| C2 - денежный | x.ToString("C2") | 1 234,57 ₽ |
| P1 - процент (число 0.256) | 0.256.ToString("P1") | 25,6 % |
| E3 - экспоненциальный | x.ToString("E3") | 1,235E+003 |
| 0.00 - пользовательский | x.ToString("0.00") | 1234,57 |
| #,##0.0 | x.ToString("#,##0.0") | 1 234,6 |
| D5 - целое с нулями слева | 42.ToString("D5") | 00042 |
| X - шестнадцатеричный | 255.ToString("X") | FF |
Формат работает и внутри интерполяции: $"{price:F2}" эквивалентно price.ToString("F2"). В целых числах для вывода с разделителями используйте N0. Подробнее о форматировании чисел с заданным количеством знаков написано в статье про вывод десятичного значения с двумя знаками.
Культура: запятая или точка
Если нужна определённая запись независимо от настроек компьютера, передавайте культуру явно. CultureInfo.InvariantCulture всегда использует точку и не добавляет пробелы-разделители, а new CultureInfo("ru-RU") всегда запятую.
using System.Globalization;
double x = 1234.567;
textBox1.Text = x.ToString("F2", CultureInfo.InvariantCulture); // 1234.57
textBox2.Text = x.ToString("F2", new CultureInfo("ru-RU")); // 1234,57
textBox3.Text = x.ToString("N2", new CultureInfo("en-US")); // 1,234.57
Правило простое: для показа пользователю берите текущую культуру (то есть ничего не передавайте), а для файлов, сетевых запросов и сохранения в настройки - инвариантную.
Вывод результата вычислений
Типичная задача в учебных программах: прочитать числа из двух полей, вычислить и показать результат в третьем. Для чтения используйте TryParse, а не Parse: он не бросает исключение на пустом поле или тексте и возвращает false.
private void btnCalc_Click(object sender, EventArgs e)
{
if (!double.TryParse(txtA.Text, out double a) ||
!double.TryParse(txtB.Text, out double b))
{
MessageBox.Show("Введите корректные числа.", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
txtSum.Text = (a + b).ToString("0.##");
txtProduct.Text = (a * b).ToString("N2");
if (b != 0)
txtQuotient.Text = (a / b).ToString("F3");
else
txtQuotient.Text = "деление на ноль";
}
Формат 0.## убирает хвостовые нули: 5 останется 5, а 2,5 - 2,5. Для сообщений об ошибках удобно показывать окно MessageBox, но для частой проверки лучше подсвечивать само поле.
Чтение числа из TextBox
Обратная операция не менее важна. Для целых используйте int.TryParse, для вещественных - double.TryParse либо decimal.TryParse, если речь о деньгах. Поскольку пользователи путают запятую и точку, полезно принимать оба варианта.
static bool TryReadDouble(string text, out double value)
{
text = text.Trim().Replace(',', '.');
return double.TryParse(text, NumberStyles.Float, CultureInfo.InvariantCulture, out value);
}
if (TryReadDouble(textBox1.Text, out double v))
label1.Text = $"Квадрат: {v * v:F2}";
Такая функция читает 3,14 и 3.14 одинаково и не зависит от настроек системы. Минус - она не поймёт запись с пробелами в качестве разделителя разрядов вроде "1 234,5". Если такой ввод возможен, замените пробелы заранее или передайте стиль NumberStyles.Any.
Выбор типа: int, double, decimal
intиlong- целые значения: количество, возраст, номер.double- научные расчёты и измерения, где допустима небольшая погрешность округления.decimal- деньги и всё, где важна точность десятичных знаков. Вdoubleвыражение 0.1 + 0.2 не равно 0.3 точно, а вdecimalравно.
Для денег применяйте decimal и формат C2 либо N2. Это избавит от неприятных неожиданностей вида 19,99999999 в итоговой сумме.
Ограничение ввода только цифрами
Чтобы пользователь не вводил буквы, перехватите нажатие клавиш в событии KeyPress. Обработчик разрешает цифры, управляющие клавиши (например Backspace) и один разделитель.
private void txtNumber_KeyPress(object? sender, KeyPressEventArgs e)
{
char sep = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0];
if (char.IsControl(e.KeyChar) || char.IsDigit(e.KeyChar))
return;
if (e.KeyChar == sep && !txtNumber.Text.Contains(sep))
return;
e.Handled = true; // отбрасываем остальные символы
}
Этот способ не защищает от вставки текста через Ctrl+V или контекстное меню. Поэтому всё равно проверяйте итоговое значение через TryParse в событии Validating или при нажатии кнопки.
Готовые альтернативы TextBox
Для чисел есть более подходящие элементы. NumericUpDown принимает только числа, хранит их в свойстве Value типа decimal, поддерживает минимум, максимум, шаг и число знаков через DecimalPlaces. MaskedTextBox с маской вроде 000-00-00 хорошо подходит для кодов и телефонов.
numericUpDown1.Minimum = 0;
numericUpDown1.Maximum = 1000;
numericUpDown1.DecimalPlaces = 2;
numericUpDown1.Value = 12.5m;
decimal v = numericUpDown1.Value; // чтение
maskedTextBox1.Mask = "00:00"; // время ЧЧ:ММ
Вывод массивов и списков чисел
Если нужно показать несколько значений, используйте многострочное поле (Multiline = true) и string.Join. Перевод строки в WinForms - это \r\n, то есть Environment.NewLine: одного \n для TextBox недостаточно.
int[] numbers = { 5, 12, 7, 20 };
txtLine.Text = string.Join(", ", numbers); // 5, 12, 7, 20
txtMulti.Text = string.Join(Environment.NewLine, numbers); // по строке на число
txtMulti.Lines = numbers.Select(n => n.ToString("D3")).ToArray(); // 005, 012, 007, 020
Для больших объёмов вывода (тысячи строк) не добавляйте текст по одной строке через +=: каждое присваивание перерисовывает поле и копирует всю строку. Соберите результат в StringBuilder и присвойте один раз.
Показ в реальном времени и из другого потока
Для живого вывода, например текущего значения счётчика, обновляйте Text в обработчике таймера System.Windows.Forms.Timer. Он вызывается в потоке интерфейса, поэтому дополнительных мер не требуется.
private int _ticks;
private void timer1_Tick(object? sender, EventArgs e)
{
_ticks++;
txtTicks.Text = _ticks.ToString("N0");
}
Если число вычисляется в Task.Run или обычном потоке, прямое присваивание Text вызовет ошибку межпотокового доступа. Вернитесь в поток интерфейса через Invoke, как показано в материале про обновление GUI из другого потока. В асинхронном методе на форме проще дождаться результата через await: код после него выполняется снова в потоке интерфейса.
private async void btnStart_Click(object sender, EventArgs e)
{
btnStart.Enabled = false;
long result = await Task.Run(() => HeavyCalculation());
txtResult.Text = result.ToString("N0");
btnStart.Enabled = true;
}
Только для показа: ReadOnly или Label
Если пользователь не должен менять число, поставьте полю ReadOnly = true: текст можно выделить и скопировать, но не изменить. Для обычных подписей лучше подойдёт Label, у которого свойство Text работает так же. Отключать поле через Enabled = false не стоит, так как текст станет серым и его нельзя будет скопировать.
Привязка к данным
Когда число хранится в объекте, избавьте себя от ручного преобразования. Привязка в Windows Forms конвертирует тип и поддерживает формат автоматически.
var binding = txtPrice.DataBindings.Add("Text", order, "Price", true,
DataSourceUpdateMode.OnValidation, 0, "N2");
Последний аргумент - строка формата. При потере фокуса значение из поля вернётся в свойство Price, а если ввод некорректен, привязка откатит его. В WPF то же делается через {Binding Price, StringFormat=N2}.
Типичные ошибки
- Попытка присвоить число без преобразования:
textBox1.Text = 5;. Нужна строка. FormatExceptionотdouble.Parse("1.5")на русской локали. ИспользуйтеTryParseс нужной культурой.- Потеря знаков при выводе: ожидается 0,333333, а выводится 0,3 из-за формата
F1. - Сравнение вещественных чисел через
==после арифметики. Сравнивайте с допуском. - Деление на ноль: для целых бросает исключение, для вещественных даёт бесконечность или NaN, которые будут показаны в поле как "∞" или "NaN".
- Присвоение Text при каждом изменении числа внутри цикла на сотни тысяч итераций: поле тормозит. Выводите результат после цикла.
Частые вопросы
Как вывести число в TextBox в C#?
Преобразуйте его в строку и присвойте свойству Text: textBox1.Text = number.ToString(); либо textBox1.Text = $"{number}";.
Как вывести число с двумя знаками после запятой?
Используйте формат: number.ToString("F2") или $"{number:F2}". Для разделителя разрядов вместо F2 применяйте N2.
Как получить число из TextBox?
Вызовите int.TryParse(textBox1.Text, out int n) или double.TryParse. Проверяйте результат, потому что поле может быть пустым или содержать буквы.
Почему программа падает при вводе дробного числа с точкой?
На русской Windows десятичным разделителем служит запятая, и Parse не понимает точку. Принимайте оба варианта, заменяя запятую на точку и разбирая с CultureInfo.InvariantCulture.
Как разрешить вводить в TextBox только цифры?
Отфильтруйте символы в событии KeyPress и дополнительно проверяйте итог через TryParse. Проще всего заменить поле на NumericUpDown.
Как вывести несколько чисел в одном TextBox?
Включите Multiline и соберите строку через string.Join(Environment.NewLine, numbers). Для вывода в строку через запятую укажите разделитель ", ".





