Загрузка данных


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;
}