private bool IsValidInput(string currentText, int caretIndex, string newText)
{
// 1. Разрешаем только 1 символ
if (string.IsNullOrEmpty(newText) || newText.Length != 1)
return false;
char ch = newText[0];
// Разрешённые символы
string allowed = "0123456789+-*/^.";
if (!allowed.Contains(ch))
return false;
// Будущая строка после вставки
string newString = currentText.Insert(caretIndex, newText);
// Символ слева от курсора
char? left = caretIndex > 0 ? currentText[caretIndex - 1] : (char?)null;
// Символ справа от курсора
char? right = caretIndex < currentText.Length ? currentText[caretIndex] : (char?)null;
// -------------------------
// Операторы
// -------------------------
if ("+-*/^".Contains(ch))
{
if ((left != null && "+-*/^".Contains(left.Value)) ||
(right != null && "+-*/^".Contains(right.Value)))
{
return false;
}
}
// -------------------------
// Точка
// -------------------------
if (ch == '.')
{
// Нельзя две точки подряд
if ((left != null && left == '.') || (right != null && right == '.'))
return false;
// Найти границы текущего числа
int start = caretIndex;
while (start > 0 && char.IsDigit(currentText[start - 1]) ||
(start > 0 && currentText[start - 1] == '.'))
{
start--;
}
int end = caretIndex;
while (end < currentText.Length && char.IsDigit(currentText[end]) ||
(end < currentText.Length && currentText[end] == '.'))
{
end++;
}
string numberPart = currentText.Substring(start, end - start);
// Если уже есть точка в этом числе
if (numberPart.Contains('.'))
return false;
}
return true;
}