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


Автор: PIF 16.8.2005, 16:06
Здравствуйте! У меня такая проблема, при написании программы разделитель между целой и дробной частью числа в системе стоял символ "," при изменение разделителя в системе программа отказывается принимать число с разделителем "." Что мне делать?
Заранее благодарен!

Автор: Pakshin A. S. 16.8.2005, 16:13
Это при преобразовании строки?
Тогда вот это попробуй:
Код

var
 s:string;
 r: real;
 format: TFormatSettings;
begin
 s:=Edit1.Text;
 if Pos('.', s) <> 0 then
   format.DecimalSeparator:='.'
  else
   format.DecimalSeparator:=',';
 r:=StrToFloat(s, format)
end;


От системы не зависит...

Автор: s-mike 16.8.2005, 16:17
Цитата(PIF @ 16.8.2005, 16:06)
Здравствуйте! У меня такая проблема, при написании программы разделитель между целой и дробной частью числа в системе стоял символ "," при изменение разделителя в системе программа отказывается принимать число с разделителем "." Что мне делать?
Заранее благодарен!

Лучше используй всегда точку, а для преобразования в число - процедуру Val.

Автор: Pakshin A. S. 16.8.2005, 16:45
Еще вариант: переопределить по-своему функцию StrToFloat

Код

(*За красивость не отвечаю...*)
function StrToFloat(const s: string):extended;
var
 i:integer;
 dr, dc, v: extended;
 c:integer;
 fl: boolean;
begin
 dr:=0; dc:=0;
 fl:=false;
 c:=1; v:=1;
 for i:=Length(s) downto 1 do
   if s[i] = '-'
    then
     v:=-1
    else
     if ((s[i] = '.') or (s[i] = ','))
      then
       begin
        if not fl
         then
          fl:=true;
       end
      else
       if fl
        then
         begin
          dc:=dc + (ord(s[i]) - ord('0')) * c;
          c:=c * 10;
         end
        else
         dr:=(dr + ord(s[i]) - ord('0')) / 10;
 Result:=(dc + dr) * v;;
end;

Автор: PIF 16.8.2005, 19:20
Цитата(Pakshin @ 16.8.2005, 16:13)
Это при преобразовании строки?
Тогда вот это попробуй:
Код

var
 s:string;
 r: real;
 format: TFormatSettings;
begin
 s:=Edit1.Text;
 if Pos('.', s) <> 0 then
   format.DecimalSeparator:='.'
  else
   format.DecimalSeparator:=',';
 r:=StrToFloat(s, format)
end;


От системы не зависит...

выдает ошибки
[Error] Unit1.pas(172): Undeclared identifier: 'TFormatSettings' format: TFormatSettings;
[Error] Unit1.pas(183): Missing operator or semicolon format.DecimalSeparator:='.'
[Error] Unit1.pas(186): Too many actual parameters r:=StrToFloat(s, format)

Автор: EDuard 16.8.2005, 19:33
Цитата
выдает ошибки
[Error] Unit1.pas(172): Undeclared identifier: 'TFormatSettings' format: TFormatSettings;
[Error] Unit1.pas(183): Missing operator or semicolon format.DecimalSeparator:='.'
[Error] Unit1.pas(186): Too many actual parameters r:=StrToFloat(s, format)


В uses пропиши SysUtils.

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