Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > StrToFloat()


Автор: Diesel Draft 7.2.2007, 00:22
Чувствую себе полным нубом. 
И так ситуация: я использую StrToFloat() , но входная строка не всегда формату “aa,bb”, а иногда “aa.bb”. Я не хочу заменять реплейсом знак. Я помню что была функция которая отключала это во всей винде и позволяла пользуватся «,» и «.»
Помогите вспомнить пожалуйста. 

Автор: Sunvas 7.2.2007, 00:35
Поиск по форуму DecimalSeparator!
Вот, чтобы долго не мучался.
http://forum.vingrad.ru/topic-61562.html

Автор: MetalFan 7.2.2007, 00:45
AFAIK, DecimalSeparator может быть только один в системе. либо "." либо "," либо другой знак...

Автор: Diesel Draft 7.2.2007, 01:00
Цитата

Я не хочу заменять реплейсом знак


Я всегда пользуюсь поиском  smile 

надо будет порытса внутри  smile 

Автор: Sunvas 7.2.2007, 01:07
Цитата(Diesel Draft @  7.2.2007,  01:00 Найти цитируемый пост)
Я всегда пользуюсь поиском

Посмотри внизу. Там много-много похожих тем.

Автор: Diesel Draft 7.2.2007, 01:36
смотрел  smile 

Автор: Snowy 7.2.2007, 09:53
Код

  s := StringReplace(s, ',', DecimalSeparator, rfReplaceAll);
  s := StringReplace(s, '.', DecimalSeparator, rfReplaceAll);
  r := StrToFloatDef(s, 0);

Автор: ivan219 7.2.2007, 10:59
Ты номерное с типом Real работаешь случаем не в Edit smile 
Процедура для Edit событие OnCange можешь переделать под что хочешь приписав первые и последние две строчки. 
Код

{Процедура ограничения в вода в Edit с преобразованием '.' в ',' ('0..9',',','.','E','+','-')}
procedure EditCh(Sender:TObject);
const WrongSepArr : array[0..1] of char =('.',','); //создаём константу - массив для хранения символов, которые надо преобразовать в разделитель
Var
  CurStr: String;
  Counter,SelPos,SeparatorPos  :Integer;
begin
  SelPos:=TLabeledEdit(Sender).SelStart; //положение курсора
  CurStr:=TLabeledEdit(Sender).Text;//Текст из Edit, который изменён
  if CurStr='' then //Если текста нет
   begin
    TLabeledEdit(Sender).Text:='0';     //Поставить 0
    TLabeledEdit(Sender).SelStart:=1;   //Отвести курсор на 1
    Exit;          //Выйти
   end;
  for counter := 0 to 1 do  //Перечисление по массиву
   if WrongSepArr[counter]<> DecimalSeparator then
    while Pos(WrongSepArr[counter],CurStr)>0 do   //ищем данный элемент массива в тексте
     CurStr[Pos(WrongSepArr[counter],CurStr)]:=DecimalSeparator;//Заменяем на сепаратор
  SeparatorPos:=Pos(DecimalSeparator,CurStr); //Ищем первый сепаратор
  for Counter:= Length(CurStr) downto 2 do  //Перечисление по строке от конца до 2 элемента (обратный, т.к. может быть удалены символы и как следствие - уменьшена длина)
   begin
    if (curStr[Counter] in [DecimalSeparator])and(Counter=SeparatorPos) then //если сепаратор и он не первый
     curStr[Counter] := DecimalSeparator  //удаляем
    else
     if not (curStr[Counter] in ['0'..'9','E','e','-','+']) then    //иначе ели не разрешённый символ
      begin
       Delete(CurStr,counter,1);  //удаляем
       dec(SelPos); //Уменьшить на 1
      end;
  end;
  if (curStr[1] in [DecimalSeparator])and(SeparatorPos=1) then //Если первый знак . или , то поставить 0,
   begin
    curStr[1]:=DecimalSeparator;
    insert('0',curStr,0);
    inc(SelPos); //Увеличить на 1
   end;
  if (curStr[length(curStr)]='E')or(curStr[length(curStr)]='e') then //Если последний символ E
   Delete(CurStr,length(curStr),1);  //Удалить
  if (curStr[length(curStr)]='-')or(curStr[length(curStr)]='+') then //Если последний символ знак
   Delete(CurStr,length(curStr),1);  //Удалить
  if length(curStr)>=2 then //Если длина больше 1
   if (curStr[1] in ['+','-'])and(curStr[2] in [DecimalSeparator]) then  //Если первый символ знак
    begin
     insert('0',curStr,2); //Вставить 0 вторым символом
     inc(SelPos);  //Увеличить на 1
    end;
  if not (curStr[1] in ['0'..'9','+','-']) then   //Если первый символ запрещён
    Delete(CurStr,1,1); //Удалить
  while (length(curStr)>=2)and(curStr[1]='0')and(curStr[2]<>DecimalSeparator)do //удалить нули в начале числа
   delete(CurStr,1,1); //Удалить
  while (length(curStr)>=3)and(curStr[1]in['+','-'])and(curStr[2]='0')and(curStr[3]<>DecimalSeparator)do //удалить нули в начале числа, если первый символ - знак
   delete(CurStr,2,1); //Удалить
  TLabeledEdit(Sender).Text:=CurStr;  //Результат
  TLabeledEdit(Sender).SelStart:=SelPos;  //Результат
end;

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

Автор: Diesel Draft 9.2.2007, 02:18
ivan219, Непонемаю к чему єто

Автор: ivan219 9.2.2007, 10:06
Ну как к чему эта процедура позволяет в водить только цифры в Edit ещё меняет . на , я так понятл что ты хочеш работать с типам Real вот и привёл пример smile 

Автор: Alexeis 9.2.2007, 12:10
У меня винда русская и разделитель "," Указываю ему в качестве разделителя '.' и все срабатывает.
Код

procedure TForm1.Button1Click(Sender: TObject);
var
 c : extended;
begin
  Edit1.text := '3.14159265358979323846264338327950288';
  c := Strtofloat(Edit1.text);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DecimalSeparator := '.';
end;


но это не дружественно по отношению к пользователям привыкшим везде писать ","

Автор: Akella 9.2.2007, 12:45
я вот тоже всегда использую вариант, предложенный Snowy!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)