Как указано Хроно в другой ответ, MaskedTextBox
является лучшим решением.Но если вы действительно хотите добавить ограничения и форматирование в текстовое поле, вы можете просто проанализировать текст в decimal
, а затем полностью заменить ключ запятой и разрешить только одно десятичное число.
Это немного взломан вместе, но должны добиться того, что вы ищете:
Сначала нужно создать обработчик событий, чтобы не допустить запись запятой и только позволяют один десятичную точку
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
//Just don't let them type commas - We will format after the TextBox is left
if (!char.IsControl(e.KeyChar)
&& !char.IsDigit(e.KeyChar)
&& e.KeyChar == ',')
{
e.Handled = true;
}
// only allow one decimal point
if (e.KeyChar == '.'
&& (sender as TextBox).Text.IndexOf('.') > -1)
{
e.Handled = true;
}
}
Затем создайте немного вспомогательный метод для анализа значения вашего TextBox к decimal
private decimal GetValueFromTextBox(string input)
{
input = System.Text.RegularExpressions.Regex.Replace(input, @"[,$%]", String.Empty);
//Could use Try parse here for better handling
decimal output = Convert.ToDecimal(input);
return output;
}
Тогда просто вызовите функцию от вашего TextBox_Leave
событие:
private void textBox1_Leave(object sender, EventArgs e)
{
var value = GetValueFromTextBox(textBox1.Text);
textBox1.Text = value.ToString("c");
}
Это формат значение в формате валюта с надлежащим размещением запятой исполнения только один десятичной точки а. Опять НЕ ЛУЧШЕЕ РЕШЕНИЕ (используйте MaskedTextBox), но он будет работать для обычного управления TextBox
.
Имейте в виду, что жестко прописывать запятой в качестве десятичного разделителя действительно не является хорошей идеей. Вы должны соблюдать региональные настройки конечного пользователя. Или, по крайней мере, работайте с культурой ui, с которой вы определяете свое приложение. – Crono