Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/30: Рейтинг темы: голосов - 30, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 21.10.2014
Сообщений: 4

Edit и отрицательные числа

26.10.2014, 23:55. Показов 5833. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте !
Помогите решить проблему .
Пользуюсь С builder XE6 . В поле Edit не могу ввести отрицательное число , точнее вообще знак минус . Выдаёт ошибку "Is not a valid floating point value "

Вот часть кода .
C++
1
2
3
4
5
float x1, x2, x3, y1, y2, y3;
void __fastcall TForm1::Edit1Change(TObject *Sender) {
 
    x1 = StrToFloat(Edit1->Text);
}
Пробовал прописывать определенные символы и числа , а именно от 0-9 символ "-" "," в сообытии PressKey , выдаёт такую же ошибку .

Помогите неучу пожалуйста .
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.10.2014, 23:55
Ответы с готовыми решениями:

Проверка числа в Edit
Доброе время суток. Проблема такая. Есть поле Edit. Необходимо, чтобы при событии OnExit проверялось то, что в эдите написано. Если это...

Случайные числа выводящиеся в Edit
Привет всем, возникла проблема, нужно что бы при нажатии на кнопку(Button1) выводилось случайное число(от 1 до 100) в Edit. Гуглил и ничего...

Преобразование числа в строку из edit
Здравствуйте. Ситуация оч глупая. В аксесе я сделал связи Счётчик-код (1-многим), и мне нужно каким-то образом в код(числовой) записать...

18
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
27.10.2014, 00:23
У меня нет Builder-a, но, наверное, оборачивание в try/catch должно помочь
C++
1
2
3
4
5
6
try {
    x1 = StrToFloat(Edit1->Text);
}
catch(...) {
// здесь ваши действия на некоректный ввод
}
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33185 / 21483 / 8231
Регистрация: 22.10.2011
Сообщений: 36,855
Записей в блоге: 12
27.10.2014, 00:37
Зачем исключения ловить?
C++
1
    x1 = StrToFloatDef(Edit1->Text, 0);
Пока будет некорректное значение - x1 будет нулевым. Ну, или какое-то другое дефолтное значение выбрать...
2
place status here
 Аватар для gunslinger
3185 / 2219 / 640
Регистрация: 20.07.2013
Сообщений: 5,986
27.10.2014, 01:22
А лучше выставь у Edit свойство NumbersOnly в 0 (false) для начала и потом пропиши ограничения по вводу.
Причем название свойства следовало "обозвать" DigitsOnly (только цифры в противоположность числам, для меня эта разница более чем очевидная - цифра является числом, но обратное "число есть цифра" в общем случае не верно), ибо ни разделить десятичной точки, ни знак отрицательного числа вручную нельзя ввести. Даже не знаю, чем думали разработчики IDE. Может у них там своя логика.
0
Модератор
 Аватар для D1973
9903 / 6441 / 2454
Регистрация: 21.01.2014
Сообщений: 27,341
Записей в блоге: 3
27.10.2014, 10:50
Цитата Сообщение от Kir964 Посмотреть сообщение
void __fastcall TForm1::Edit1Change(TObject *Sender)
Ну так ты в каком событии делаешь преобразование?
Ты набираешь знак -, происходит событие OnChange и, соответсвенно, попытка преобразовать этот текст "-" в число с плавающей точкой. Если ты сначала введешь число, потом вернешься на первую позицию строки ввода и поставишь знак -, то никакой ошибки не возникнет.
Так что подумай, где производить это преобразование StrToFloat
1
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329
27.10.2014, 12:32
Стандартно обработку завершения ввода числа вводят в OnKeyPress
а в OnChange только проверяют на недопустимость символов, если надо. Имхо, проще всего сделать так:
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, System::WideChar &Key)
{
  if (Key==13) {// code of "Enter"
    try {
      x1 = StrToFloat(Edit1->Text);
    } catch(...) {
    //неправильно введенное число, обругать пользователя
      Edit1->Text =""; 
    }
}
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33185 / 21483 / 8231
Регистрация: 22.10.2011
Сообщений: 36,855
Записей в блоге: 12
27.10.2014, 13:36
То есть, лишь бы набыдлокодить? Понятно. Извините, что влез с решением, которое обходится без отлова исключений... Больше не повторится...
0
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329
27.10.2014, 13:43
Хм. Я почему то решил что в данной теме решили предложить несколько различных вариантов решения.
А уж ТС выберет лучшее для его ситуации.
Например твое решение хорошее, но в нем нельзя реализовать предупреждение человеку, о том что он ввел неправильные данные.
А использовать дефолтное значение при ручном вводе - тоже как бы не фонтан...
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
27.10.2014, 14:27
krv, UI вам намекает на TryStrToFloat().
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33185 / 21483 / 8231
Регистрация: 22.10.2011
Сообщений: 36,855
Записей в блоге: 12
27.10.2014, 15:21
Неправда, я написал выше, в третьем посте, что имелось в виду... На фиг мне был бы там нужен еще Try..., если после него надо опять проверять результат? Я одной командой бы сделал то, что нужно, безо всяких проверок.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.10.2014, 15:36
Да зависит от "политики партии".

Но обычно приходится проверять дважды один раз при вводе, второй раз при присвоении значения и начале расчетов.

А давать возможность пользователю считать по дефолтными значениям при неправильном вводе без единого предупреждения тоже не всегда допустимо.
0
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329
27.10.2014, 15:41
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, System::WideChar &Key)
{
  if (Key==13) {// code of "Enter"
    if (!TryStrToFloat(Edit1->Text,x1)) {
    //неправильно введенное число, обругать пользователя
      Edit1->Text =""; 
    }
}
Да можно и так... Но я подозреваю, что внутри этого TryStrToFloat опять же
C++
1
2
3
4
try {
  out = StrToFloat(Edit1->Text);
} catch(...) {
}
Так что в лоб, что по лбу..
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.10.2014, 16:05
Как пример сообщение в лейбл о некорректом вводе.

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
35
36
37
#include <System.RegularExpressions.hpp>
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    Edit1->Text= "0";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    float x1;
    try
    {
        x1 = StrToFloat(Edit1->Text);
        //...
    }
    catch(const Exception& E)
    {
        ShowMessage("Некорректно заданны исх.данные "+E.Message);
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
    TRegEx Re("^((-?\\d+)|(-?\\d+,\\d*))$");
    if(Re.IsMatch(Edit1->Text) )
    {
        Label1->Font->Color= clLime;
        Label1->Caption= "Ok!";
    }
    else
    {
        Label1->Font->Color= clRed;
        Label1->Caption= "Ошибочный ввод!";
    }
}
//---------------------------------------------------------------------------

Видео
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.10.2014, 18:28
Подумал можно еще сделать c откатом значения и подсказкой:

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <System.RegularExpressions.hpp>
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    Edit1->Text= "0";
    BalloonHint1->Title= "Ошибка:";
    BalloonHint1->Description= "Некорректный ввод!";
    BalloonHint1->Delay= 10;
    BalloonHint1->HideAfter= 500;
    BalloonHint1->ImageIndex= 1;
}
//---------------------------------------------------------------------------
String OldEditValue="";
int  CaretPos= 0;
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
    TRegEx Re("^((-?\\d+)|(-?\\d+,\\d*))$");
    if(Re.IsMatch(Edit1->Text) )
    {
        OldEditValue= Edit1->Text; 
    }
    else
    {
        Edit1->Text= OldEditValue; // откат
                // Перемещение каретки в исходное потожение
        int length= Edit1->Text.Length();
        CaretPos= (CaretPos<length)?CaretPos:length;
        Edit1->SelStart= CaretPos;
                // Подсказка
        TPoint P(Edit1->BoundsRect.Right,
                Edit1->BoundsRect.Top+Edit1->ClientRect.Height()/2);
        BalloonHint1->ShowHint(Form1->ClientToScreen(P));
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, System::WideChar &Key)
{
     CaretPos= Edit1->SelStart; // Запоминаем положение курсора
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    float x1;
    try
    {
        x1 = StrToFloat(Edit1->Text);
        //...
    }
    catch(const Exception& E)
    {
        ShowMessage("Некорректно заданны исх.данные "+E.Message);
    }
}
//---------------------------------------------------------------------------
2
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
28.10.2014, 09:09
Цитата Сообщение от krv Посмотреть сообщение
я подозреваю, что внутри этого TryStrToFloat
паскалевская реализация. В ней нет исключений.
0
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
28.10.2014, 11:56
Цитата Сообщение от UI Посмотреть сообщение
То есть, лишь бы набыдлокодить?
почему сразу "набыдлокодить"? Насколько я понял функция StrToFloatDef всегда заменяет дефолтным значением некорректный ввод, но иногда никакого дефолтного значения и быть не может по логике программы. Например вы делаете калькулятор сложения и у вас два поля для ввода - числа, которые, собственно, нужно сложить. И вот в одно поле вы вводите "2", а во второе "а". В вашей программе ответ получится "2" (если дефолтным указать ноль), что является очевидной глупостью. Более подходящим вариантом видится перехват ввода во втором поле и сигнализация об ошибке. Я в подобных случаях использую структуру try/catch и если в поле введено некорректное значение, то выдаю соответствующее сообщение ShowMessage, устанавливаю фокус на поле, где допущена ошибка и выделяю его содержимое. Мне кажется такое поведение наиболее подходящим и универсальным.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
28.10.2014, 12:09
Цитата Сообщение от Нитонисе Посмотреть сообщение
Более подходящим вариантом видится перехват ввода во втором поле и сигнализация об ошибке.
Неверно.
Более подходящим является простой анализ строки. И сравнение символов на принадлежность к цифрам. Механизм исключений использовать здесь слишком жирно. Это не значит, что он не сработает. Сработает. Как впрочем и вариант нанять человека, который будет за неверный ввод бить по рукам линейкой.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.10.2014, 13:17
Цитата Сообщение от Нитонисе Посмотреть сообщение
И вот в одно поле вы вводите "2", а во второе "а".
И это не самый спорный вариант, ибо ввод "а" можно запретить, а вот "-" запретить нельзя ибо число может быть отрицательным, но пользователь может ввести "-", но не чисел, что не верно. Именно по этому нужна двойная проверка.
0
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
28.10.2014, 19:04
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Более подходящим является простой анализ строки.
Это что за анализ? В блоке try при попытке присвоить переменной типа float результат, возвращаемый функцией StrToFloat в принципе анализом можно и назвать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.10.2014, 19:04
Помогаю со студенческими работами здесь

Округлить числа в поле Edit
Добрый день! Не могу разобраться как округлить числа в поле Edit в которых вывожу результат. Edit3-&gt;Text = 2 * (...

От числа в Edit меняется количество формул
Здравствуйте подскажите пожалуйста есть такой код void __fastcall TForm1::Button1Click(TObject *Sender) { double n, m, u, t, M, a,...

Определить, есть ли в массиве отрицательные числа
Определить, есть ли в массиве В отрицательные числа. Ответ должен быть «Да» или «Нет».

Как считывать числа из memo или edit?
Уже неделю сижу и пытаюсь понять как это сделать. Все, что можно перепробовал, но считывается только количество символов, или вообще не...

Преобразование числа из Edit с помощью функции atof
Есть Edit1 в котором записано число, которое мне нужно преобразовать через функцию atof. Мои попытки безнадёжны:cry: ....Как правильно...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru