C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
О тексте и числах, Как проверить, является ли текст числом?
Ramzay
Отправлено: 18.03.2007, 10:07


Дежурный стрелочник

Группа: Участник
Сообщений: 31



Переодически возникает необходимость что бы пользователь ввел в поле TEdit число. После ввода нужно сделать проверку: действительно ли ввели число или ввели просто какой-либо текст?

Обыно, я это делою так:
CODE

int iTest=-999999; // число, которое заведомо не будет введено
try
{
iTest=StrToInt(Edit3->Text); // или StrToFloat(Edit3->Text);
}
catch(...)
{ }
if(iTest==-999999)
{
ShowMessage("...."); // Здесь я напишу все, что думаю о пользователе
Action=caNone;
return;
}

Может кто подскажет способ покороче?

Ps Тема "О тексте и числах" (сори) rolleyes.gif

Отредактировано Ramzay — 18.03.2007, 10:41
Ronin
Отправлено: 18.03.2007, 11:07


Ученик-кочегар

Группа: Участник
Сообщений: 7



Я считаю что приведённый тобой способ самый демократичный victory.gif
если совсем короче то просто взять и обрубить возможность вводить буковки на ивэнте нажатии клавиши, тока тут тоже есть пути обхода, например через мышь...
** Admin
Отправлено: 18.03.2007, 12:06


Не зарегистрирован







QUOTE
После ввода нужно сделать проверку: действительно ли ввели число или ввели просто какой-либо текст?


Проверки лучше делать ПЕРЕД вводом, то есть не дать
возможность ввести заведомо неправильное значение.

см. события OnKeyPress или OnEdit компонента TEdit

---

Если упростить вышеприведенный пример:
int n = Edit1->Text.ToIntDef(-99999);
if(n == -99999) ShowMessage("Не число или число -99999");
else ShowMessage("Число");

то нужна уверенность что такого числа не будет
или, если такой уверенности на 100% нет — делать это по другому,
например в цикле по строке.
Tantos
Отправлено: 18.03.2007, 13:14


Станционный диспетчер

Группа: Участник
Сообщений: 108



Лучше перехватывать в catch по EConvertError. Или воспользоваться TNumberEditEh из EhLib.
khan
Отправлено: 20.03.2007, 14:20


Ученик-кочегар

Группа: Участник
Сообщений: 19



хм, только вот если брать float или double есть хитрость с запятой, мне например нравится чтоб можно было вводить и запятую и точку. StrToFloat видит только то что настроено в языковых параметрах и если у меня стоит раша, то вводя точку вылезит ошибка, ну и вообще зачем тогда проверять число или не число кроме как для этого? Ведь StrToFloat (или Double) сам выводит инвалид флоатинг валуе. Конечно, если кого-то не устраивает эта надпись на инглише, то тогда понятно, но считаю, что если вместо запятой точка или наоборот, то это не ошибка для юзера...

Отредактировано khan — 20.03.2007, 14:34
Ramzay
Отправлено: 20.03.2007, 18:31


Дежурный стрелочник

Группа: Участник
Сообщений: 31



Большое спасибо за ответы.

QUOTE
просто взять и обрубить возможность вводить буковки


Я принципиальный противник такого метода. Например, недавно видел, как человек, искушенный в компьютерах пытался ввести дату 29.02.2007. Компьютер долго упирался изо всех сил, не давал ввести девятку и никто ничего долго не мог понять.

Другое дело дать юзеру ввести все что он хочет. Но когда он все ввел и нажал на ОК, вот тут-то он за "базар" ответит. Схватить, мордой в контрол и поюлозить. angry2.gif


QUOTE
хитрость с запятой, мне например нравится чтоб можно было вводить и запятую и точку


Элементарно, Ватсон! Устанавливаем DecimalSeparator='.' После того, как юзер все ввел, мы во введеном тексте ищем запятую и меняем ее на точку. Затем можно преобразовывать в число.
Admin
Отправлено: 20.03.2007, 23:36


Владимир

Группа: Администратор
Сообщений: 1190



QUOTE
Я принципиальный противник такого метода. Например, недавно видел, как человек, искушенный в компьютерах пытался ввести дату 29.02.2007.


Для ввода дат можно использовать специальный компонент,
в котором ничего кроме дат ввести нельзя, также как и
несуществующую дату.

Вернуться в Вопросы программирования в C++Builder