Замена запятой на точку

  • Автор темы Dream
  • Дата начала
Статус
Закрыто для дальнейших ответов.
D

Dream

#1
У меня в коде есть момент когда Edit2.text:=edit1.text данные в edit1 вводяться в ручную разделение между целой и дробной частью числа через запятую, подскажите пожалуйста как правильно оформить код что бы данные в edit2 числа разделялись через точку????
 
N

nataly_ukr

#2
Delphi - BdeaDMINISTRATOR - sYSTEM - Formats - Number - Decimalseparator где-то здесь , сообрази сам делала уже такое давно
 
Z

zubr

#3
Вариантов много. Можно, к примеру так:
Код:
function FloatValue(data:string):string;
var
i:Integer;
s:string;
begin
s:=data;
i:=1;
While i<=Length(s) do
begin
If (not (s[i] in ['0'..'9'])) and (s[i]<>'.') then
begin
Delete(s, i, 1);
continue;
end;
inc(i);
end;
Result:=s;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
TEdit(Sender).Text:=FloatValue(TEdit(Sender).Text);
TEdit(Sender).SelStart:=Length(TEdit(Sender).Text);
end;
 
S

Silver Wind

#4
Как вариант, можно запретить пользователю набрать неправильное значение, написав примерно такой обработчик OnKeyPress:

Код:
procedure TfmAdd.edVmKeyPress(Sender: TObject; var Key: Char);
begin
if Not(Key in ['0'..'9',',','.','-',' ',#8])
then begin Key:=#0; exit; end;
if Key in [',','.',' ']
then Key:=DecimalSeparator;
if (Key='-') and
(Pos('-',TEdit(Sender).Text)>0)
then Key:=#0;
if (Key=DecimalSeparator) and
((TEdit(Sender).Text='') or (Pos(DecimalSeparator,TEdit(Sender).Text)<>0))
then Key:=#0;
end;
Он автоматически исправит точку, запятую или пробел на DecimalSeparator - эта стандартная переменная типа char в Delphi и принимает свое значение в зависимости от региональных настроек.
Заодно приведенный код блокирует ввод недопустимых символов.

Подредактируй под свои нужды.
 
H

h-falcon

#5
Можно попробовать таким способом. Может и не совсем красиво, но работает.

Код:
procedure TMainForm.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if not (Key in ['0'..'9',#8,#9]) then begin			 //для числа иные символы недопустимы
if Pos('.',TEdit(Sender).Text)>0 then Key:=#0  //разделитель должен быть ОДИН
else if TEdit(Sender).Text<>'' then begin		 //если строка непустая, то разделитель
//можно ввести только после любой цифры
if Length(TEdit(Sender).Text)-TEdit(Sender).SelLength=0 then Key:=#0
else if TEdit(Sender).SelStart=0 then Key:=#0
else Key:='.';
end
else Key:=#0;
end
else if (Key=#8) and (TEdit(Sender).SelStart=1) and (Pos('.',TEdit(Sender).Text)=2) then
//при удалении BackSpace'ом разделитель
//не должен оказаться первым символом в строке
Key:=#0;
end;
Прошу извинить за отсутствие форматирования текста (см. сообщение выше),
но когда набирал в окне всё было отформатировано.
 
B

Barmutik

#6
От Ctrl+V спасёт ещё OnChange обработка.. а лучше использовать спец контрол...
 
Статус
Закрыто для дальнейших ответов.