Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/55: Рейтинг темы: голосов - 55, средняя оценка - 4.91
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
1
.NET 3.x

Запрет ввода букв в консоли

14.03.2016, 12:26. Показов 10774. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ну например на форме это делается так:

C#
1
2
3
4
5
private void textbox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((e.KeyChar <= 47 || e.KeyChar >= 58) && e.KeyChar != 8)
                e.Handled = true;
        }
А как в консоли сделать? Чтобы не печатались буквы!

Добавлено через 1 час 36 минут
Выручайте ребята
Как сделать такое в консоли?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.03.2016, 12:26
Ответы с готовыми решениями:

Запрет ввода символов в консоли
Мне надо считать нажатие клавиши с помощью: Console.ReadKey(); Но символ на который мы нажали не...

Запрет ввода всего кроме русских букв
Как запретить ввод в консоль всего кроме русских букв? Помогите, пожалуйста :)

Как сделать запрет ввода букв в поле для ввода input
Здравствуйте! Есть стандартное поле ввода &lt;input type='text' name='name1' size='30'...

Запрет ввода в консоли
Ребят, привет. Сейчас пишу змейку в консоли. Написано относительно мало. Тут столкнулся с...

10
910 / 795 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
14.03.2016, 12:35 2
как пример, дальше уже дорабатывай под себя
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
string result = "";
            while (true)
            {
                ConsoleKeyInfo key = Console.ReadKey(true);
                switch (key.Key)
                {
                    case ConsoleKey.Backspace:
                        if (result.Length > 0)
                        {
                            result = result.Remove(result.Length - 1, 1);
                            Console.Write(key.KeyChar + " " + key.KeyChar);
                        }
                        break;
                    case ConsoleKey.Enter:
                        Console.WriteLine();
                        return result;
                    default:
                        if (char.IsDigit(key.KeyChar))
                        {
                            Console.Write(key.KeyChar);
                            result += key.KeyChar;
                        }
                        break;
                }
            }
2
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
14.03.2016, 13:05  [ТС] 3
Переделал так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public static string OnlyIsDig()
    {
        string result = "";
        while (true)
        {
            ConsoleKeyInfo key = Console.ReadKey(true);
            switch (key.Key)
            {
                case ConsoleKey.Backspace:
                    if (result.Length > 0)
                    {
                        result = result.Remove(result.Length - 1, 1);
                        Console.Write(key.KeyChar + " " + key.KeyChar);
                    }
                    break;
                case ConsoleKey.Enter:
                    Console.WriteLine();
                    return result;
                default:
                    if (key.KeyChar >= '0' && key.KeyChar <= '9')
                    {
                        Console.Write(key.KeyChar);
                        result += key.KeyChar;
                    }
                    break;
            }
        }
    }
Но теперь проблема :
Вызываю:
C#
1
2
 string VX = OnlyIsDig();
        Console.Write(VX);
В начале : пустое окно, нажимаются только цифры, нажимаю Enter всё пропадает (то есть можно писать что хочешь)

Например ставлю:
C#
1
2
3
Console.Write(Environment.NewLine);
        Console.Write("   Выберите способ отправки: ");
 Console.Write(VX);
Почти то что нужно, но нажимаю 4, мне показывает 44
И так по новой.

Как сделать нормально?
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
14.03.2016, 13:13 4
Немного улучшенный вариант: использовать строки для конкатенации нехорошо
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
        static void Main(string[] args)
        {
            string line = GetLineNoLetters();
            Console.WriteLine("Input value is {0}", line);
        }
 
        private static string GetLineNoLetters()
        {
            var sb = new StringBuilder();
            while (true)
            {
                var key = Console.ReadKey(true);
                switch (key.Key)
                {
                    case ConsoleKey.Enter:
                        Console.WriteLine();
                        return sb.ToString();
                    case ConsoleKey.Backspace:
                        if (sb.Length > 0)
                        {
                            sb.Length -= 1;
                            Console.Write("\b \b");
                        }
                        break;
                    default:
                        if (!char.IsLetter(key.KeyChar))
                        {
                            sb.Append(key.KeyChar);
                            Console.Write(key.KeyChar);
                        }
                        break;
                }
            }
        }
Добавлено через 45 секунд
chaleureux,
C#
1
key.KeyChar >= '0' && key.KeyChar <= '9'
так писать плохо, используйте char.IsLetter/char.IsDigit и прочие методы.
1
910 / 795 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
14.03.2016, 13:15 5
чтобы не пропадало надо вставить
C#
1
 Console.ReadKey();
в конце просто как пример. На счёт того что показывает 44 увы но воспроизвести такое я не смог.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
14.03.2016, 13:18 6
SeIZVeIZ, предпочитаю ctrl+F5, из плюсов еще и запускается намного быстрее
0
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
14.03.2016, 13:25  [ТС] 7
Выше описанный вариант конечно лучше, спс, но по прежнему выдает 44 как бы не старался

Добавлено через 3 минуты
C#
1
2
string VX = GetLineNoLetters();
Console.Write("   Выберите  способ отправки: "  + VX);
При запуске появляется пустое окно, если нажать enter появляется)
Выберите способ отправки: нажимаю 4 ( и теперь как получается )
переход на новую строку ( пустое место )
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
14.03.2016, 14:45 8
chaleureux, Запустите код выше (который я написал) ровно так, как написано. Потом наберите 12345. Потом говорите, что у вас получилось (можно скриншотом).
0
Эксперт .NET
5871 / 4748 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
14.03.2016, 14:51 9
chaleureux,
а так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public static string GetLineNoLetters()
{
    ConsoleKeyInfo a;
    int currentCursorPos = Console.CursorLeft;
    string str = string.Empty;
    do
    {
        a = Console.ReadKey(true);
        if (char.IsDigit(a.KeyChar))
        {
            Console.Write(a.KeyChar);
            str += a.KeyChar;
        }
        if (a.Key ==ConsoleKey.Backspace)
        {
            Console.SetCursorPosition(currentCursorPos, Console.CursorTop);
            if (str.Length > 0) str = str.Substring(0, str.Length - 1);
            Console.Write(str + " ");
            Console.SetCursorPosition(currentCursorPos + str.Length, Console.CursorTop);
        }
    }
    while (a.Key != ConsoleKey.Enter);
    Console.WriteLine();
    return str;
}
Вызов:
C#
1
2
Console.Write("   Выберите  способ отправки: ");
string VX = GetLineNoLetters();
0
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
14.03.2016, 15:12  [ТС] 10
Даценд
Проблема та же:
Код
// До этого можно писать только цифры!
C#
1
2
string VX = GetLineNoLetters(); // перед || далее пока не нажму какую нибудь клавишу нижняя строка не появляется :(
Console.Write("   Выберите  способ отправки: ");
После как нажму что нибудь писать можно что угодно)
0
910 / 795 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
14.03.2016, 15:15 11
chaleureux, вам написали 1 вызов, а вы используете его вверх тормашками, не путайте!

если нужно Вам именно в таком порядке, то видимо пора описать для чего и зачем, ибо гадать как надо Вам не есть хорошо
0
14.03.2016, 15:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.03.2016, 15:15
Помогаю со студенческими работами здесь

Запрет ввода символов в консоли
моя консольная программа имеет очень много вводов от пользователя, через контекстное меню (нажмите...

Запрет ввода символов в консоли
Помогите, пожалуйста, пишу программу, какую - не важно, главное что нужно, что бы нельзя было...

Запрет на ввод букв в консоли на C++
Здравствуйте, сижу за С++ не много, так что не очень в нем разбираюсь. Столкнулся вот с проблемой...

Запрет ввода любых символов кроме цифр в консоли
Ребята подскажите пожалуйста можно ли как-то разрешать ввод в консоль только цифр. Я делаю проверку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru