Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2015, 11:11   #1
Dima-91
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 198
По умолчанию Как сделать разделительный символ

Как сделать разделитель чисел (запятая или точка), что бы было видно при решении.
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <math.h>
#pragma hdrstop

#include "conv.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
char DecimalSeparator = "," || "." ; // вот тут задается глобальный знак разделителя?
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, System::WideChar &Key)
{
if ((Key >= '0') && (Key <= '9'))
return;
if (Key == DecimalSeparator)
{
if ((Edit1->Text).Pos(DecimalSeparator) != 0)
Key = 0;
return;
}
if (Key == VK_BACK)
	return;
if (Key == VK_RETURN)
 {
	Edit2->SetFocus();
	return;
}
 Key = 0 ;
 }
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2KeyPress(TObject *Sender, System::WideChar &Key)
{
  if ((Key >= '0') && (Key <= '9'))
return;
if (Key == DecimalSeparator)
{
if ((Edit2->Text).Pos(DecimalSeparator) != 0)
Key = 0;
return;
}
if (Key == VK_BACK)
	return;
if (Key == VK_RETURN)
 {
	Button1->SetFocus();
	return;
}
 Key = 0 ;
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
float usd,k,rub;
if (((Edit1->Text).Length() == 0) ||
			 ((Edit2->Text).Length() == 0))
{
	MessageDlg( "Надо ввсети цену и курс",
mtInformation, TMsgDlgButtons() << mbOK, 0);
	if ((Edit1->Text).Length() == 0)
	Edit1->SetFocus();
	else
	Edit2->SetFocus();
	return;
}
usd = StrToFloat(Edit1->Text);
k = StrToFloat(Edit2->Text);
rub = usd * k;
Label4->Caption = FloatToStrF(usd,ffGeneral,7,2) +
		"$ = "+FloatToStrF(rub,ffGeneral,7,2) + " руб." ;

}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Form1->Close();
}
//---------------------------------------------------------------------------
Dima-91 вне форума Ответить с цитированием
Старый 10.07.2015, 11:20   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Dima-91, поясните, что Вы хотите добиться - чтобы можно было при вводе вещественных чисел в качестве десятичной точки вводить хоть запятую, хоть точку?
или зафиксировать в качестве разделителя только один из этих символов?


имхо, это:
Цитата:
Код:
char DecimalSeparator = "," || "." ; // вот тут задается глобальный знак разделителя?
бессмыслица.
Переменная DecimalSeparator задаёт ОДИН символ, который выступает в качестве десятичной точки в рамках текущей программы. Никаких "ИЛИ" тут нет и быть не может.
Организовывайте такую логику самостоятельно, кодом, путём замены всех допустимых знаков на DecimalSeparator (смотрите, например, какой-нибудь ReplaceString() )
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.07.2015, 11:22   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
Label4->Caption = format("%m$ = %m  руб.",{usd,rub}) ;
Не?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.07.2015, 11:43   #4
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

вместо
Код:
usd = StrToFloat(Edit1->Text);
k = StrToFloat(Edit2->Text);
заменить на
Код:
#include strutils.h

if (DecimalSeparator == '.') 
{
  usd = StrToFloat(AnsiReplaceText(Edit1->Text,",","."));
  k = StrToFloat(AnsiReplaceText(Edit2->Text,",","."));
}
else
{
  usd = StrToFloat(AnsiReplaceText(Edit1->Text,".",","));
  k = StrToFloat(AnsiReplaceText(Edit2->Text,".",","));
}
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 10.07.2015, 12:29   #5
Dima-91
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 198
По умолчанию

1) Нужно ли задавать глобальную DecimalSeparator ? (значение которой точка или запятая )
2) В Edit1 вводятся видимые числа 0-9, а запятая(точка) не видима или вообще отсутствует. Думаю, как сделать ее видимой.
3) Примерно хочу сделать вид:
Код:
Edit1 : 100
 Edit2 : 12,321
 Label4: 1232,1
4) Возможно ли задать запятую глобально в переменной DecimalSeparator?
Dima-91 вне форума Ответить с цитированием
Старый 10.07.2015, 12:57   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В OnKeyPress меняй точку и запятую на значение из DecimalSeparator. Пользователь может вводить точку или запятую, отображаться будет только то, что в DecimalSeparator
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 10.07.2015, 14:08   #7
Dima-91
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 198
По умолчанию

Всем спасибо, ответы помогли.
Вопрос - Для точки: возможно ее приравнять к запятой, что бы можно было использовать и то и другое? Подкинули идею так как это сделать)
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <math.h>
#pragma hdrstop

#include "conv.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
char DecimalSeparator = ',' ;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, System::WideChar &Key)
{
if ((Key >= '0') && (Key <= '9'))
return;
if (Key == DecimalSeparator)
{
if ((Edit1->Text).Pos(DecimalSeparator) != 0)
Key = 0;
return;
}
if (Key == VK_BACK)
	return;
if (Key == VK_RETURN)
 {
	Edit2->SetFocus();
	return;
}
 Key = 0 ;
 }
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2KeyPress(TObject *Sender, System::WideChar &Key)
{
  if ((Key >= '0') && (Key <= '9'))
return;
if (Key == DecimalSeparator)
{
if ((Edit2->Text).Pos(DecimalSeparator) != 0)
Key = 0;
return;
}
if (Key == VK_BACK)
	return;
if (Key == VK_RETURN)
 {
	Button1->SetFocus();
	return;
}
 Key = 0 ;
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
float usd,k,rub;
if (((Edit1->Text).Length() == 0) ||
			 ((Edit2->Text).Length() == 0))
{
	MessageDlg( "Надо ввсети цену и курс",
mtInformation, TMsgDlgButtons() << mbOK, 0);
	if ((Edit1->Text).Length() == 0)
	Edit1->SetFocus();
	else
	Edit2->SetFocus();
	return;
}
usd = StrToFloat(Edit1->Text);
k = StrToFloat(Edit2->Text);
rub = usd * k;
Label4->Caption = FloatToStrF(usd,ffGeneral,7,2) +
		"$ = "+FloatToStrF(rub,ffGeneral,7,2) + " руб." ;

}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Form1->Close();
}
//---------------------------------------------------------------------------

Последний раз редактировалось Dima-91; 10.07.2015 в 14:11.
Dima-91 вне форума Ответить с цитированием
Старый 10.07.2015, 15:42   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key in [',','.'] then Key:=DecimalSeparator;
end;
Наверняка в билдер сях не сильно по другому
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 10.07.2015, 17:20   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию



Зачем тебе понадобилось проверять значение по мере ввода? Почему это вдруг стало настолько необходимо, что не лень городить тяжёлый кривой говнокод, вместо того, чтобы спрокойно проверить [и скорректировать] весь введённый текст после ввода?

з.ы. И ctrl+v ещё никто не отменял, вместе с контекстным меню.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 11.07.2015, 12:17   #10
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
В OnKeyPress меняй точку и запятую на значение из DecimalSeparator. Пользователь может вводить точку или запятую, отображаться будет только то, что в DecimalSeparator
или... то , что посчитает нужным.

а вот тут
Код:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key in [',','.'] then Key:=DecimalSeparator;
end;
нужно писать вот так (автор Сишник)

Код:
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
  if(Key!='-' || Key<'0' || Key>'9')
    Key = DecimalSeparator;
}
Изображения
Тип файла: jpg 4444.jpg (59.1 Кб, 133 просмотров)
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 11.07.2015 в 12:19. Причина: не загрузилась картинка
JUDAS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть файл, в нем словосочетания в столбец, нужно к каждому словосочетанию добавить символ. Как это сделать? antoha487 Помощь студентам 7 15.06.2012 21:58
Как сделать getch символ XxXGhosTXxX Общие вопросы C/C++ 1 23.03.2011 18:27
Как сделать getch символ XxXGhosTXxX Общие вопросы C/C++ 3 23.03.2011 16:02
Как сделать, чтобы по нажатию клавиши вводился не символ, а строка? Сид Общие вопросы Delphi 5 27.12.2009 13:32
[Делфи] Как сделать чтобы символ много раз повторялся (без массивов) zotox Помощь студентам 4 01.05.2009 22:10