this slowpoke moves

Decimal Calculating

function copyab(const s:string; const i:integer):string;
  begin result:=copy(s,i,length(s)-i+1) end;

function BinInDezVorkomma(s:string;
           var r:extended):boolean;
  var k:integer;
      p:extended;
begin
  trim(s);
  r:=0;
  p:=1;
  for k:=length(s) downto 1 do
    Begin
    if s[k]='1' then r:=r+p else
      if s[k]<>'0' then BEgin
        result:=false;
        exit;
      ENd;
  p:=p*2;
  End;
  result:=true;
end;

function BinInDezNachkomma(s:string;
          var r:extended):boolean; 
            //true kein Fehler
  var k:integer;
      p:extended;
begin
  trim(s);
  r:=0;
  p:=1/2;
  for k:=1 to length(s) do Begin
    if s[k]='1' then r:=r+p else
      if s[k]<>'0' then BEgin
        result:=false;
        exit;
      ENd;
  p:=p/2;
  End;
  result:=true;
end;

function BinInDez(s:string):string;
  var n:integer;
      a,b:string;
      vork,nachk:extended;
      korrekt:boolean;
begin
  n:=pos('.',s);
  if n=0 then n:=pos(',',s);
  if n=0 then Begin
      korrekt := BinInDezVorkomma(s,vork);
      if korrekt then result := floatToStr(vork) 
        else result := 'Falsche Eingabe';
  End else Begin
    a:=copy(s,1,n-1);
    b:=copyab(s,n+1);
    korrekt:=BinInDezVorkomma(a,vork) and 
      BinInDezNachkomma(b,nachk);
    if korrekt then result:=floatToStr(vork+nachk) 
      else result:='';
  End;
end;

function DezInBinVorkomma(s:string):string;
  var n:integer;
begin
  result:='';
  try n:=StrToInt(s) Except result:=''; exit End;
  repeat
    if n mod 2 =0 then result:='0'+result
      else result:='1'+result;
    n:=n div 2;
  until n=0;
end;

function DezInBinnachkomma(s:string):string;
  var r:extended;
      n:integer;
begin
  r:=StrToFloat('0'+Decimalseparator+s);
  result:='';
  n:=0;
  repeat
    inc(n);
    r:=2*r;
    if r>=1 then Begin
      result:=result+'1';
      r:=r-1;
    End else result:=result+'0';
  until (r=0) or (n>64);
end;

function DezInBin(s:string):string;
  var n:integer;
      a,b:string;
begin
  n:=pos('/',s);
  if n>0 then Begin //Bruch->Dezimalzahl
    a:=copy(s,1,n-1);
    b:=copyab(s,n+1);
    try s:=FloatToStr(strToFloat(a)/StrToFloat(b));
    except result:='Falsche Eingabe' End;
  End;
  n:=pos('.',s);
  if n=0 then n:=pos(',',s);
  if n=0 then result:=DezInBinVorkomma(s) else Begin
    a:=copy(s,1,n-1);
    b:=copyab(s,n+1);
    result:=DezInBinVorkomma(a)
     +decimalseparator+DezInBinNachkomma(b);
  End;
end;
Beispiel :
procedure TForm1.Edit1Change(Sender: TObject);
begin
  //if Edit1.focused then exit;
  try
    Edit2.text := dezInBin(Edit1.text);
  except 
  Edit2.text := 'Falsche Eingabe' 
  End;
end;

procedure TForm1.Edit2Change(Sender: TObject);
begin
  //if Edit2.focused then exit;
  try
    Edit1.text := BinInDez(Edit2.text);
  except 
  Edit1.Text := 'Falsche Eingabe' 
  End;
end;

Keine Kommentare:

Kommentar veröffentlichen

Beliebte Posts

Translate