Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Zahl wieder in String umwandeln (https://www.delphipraxis.net/174491-zahl-wieder-string-umwandeln.html)

Thomas Feichtner 25. Apr 2013 09:11


Zahl wieder in String umwandeln
 
Hallo,

für unser Programm muss ich daten aus einem alten DOS-Programm auslesen. Mit Zahlen mache ich das mit folgender Funktion:

Delphi-Quellcode:
function WertToFloat(pData: String; var pValue: Double): Boolean;
type
  tBA = packed array [0..SizeOf(Extended)-1] of byte;
var
  Buf1: tBA;
  i: integer;
  BufR: packed record
    case n: integer of
       0: (BA: tBA);
       4: (pad4: array [1..6] of byte; sgl: single);
       8: (pad8: array [1..2] of byte; dbl: double);
      10: (ext: extended);
    end;
  iLen: integer;
  sTemp, sHex20, sHex00: String;
  nResult: Extended;
begin
  sTemp := '';
  if (Trim(pData) = '') then begin
    Result := False;
    pVAlue := 0;
    Exit;
  end;

  iLen := Length(pData);
  for i := iLen downto 1 do
  begin
    sTemp := sTemp + IntToHex(Ord(pData[i]), 2);
    sHex20 := sHex20 + '20';
    sHex00 := sHex00 + '00';
  end;

  if (sTemp = sHex20) or (sTemp = sHex00) then
     Exit;
  sTemp := LowerCase(sTemp);
  BufR.n := HexToBin(PChar(sTemp), @Buf1, SizeOf(Buf1));
  Buf1[0] := Buf1[0] xor $80;
  nResult := 0;
  try
    for i := 0 to high(tBA) do
      BufR.BA[high(tBA)-i] := Buf1[i];
    case BufR.n of
       4: nResult := BufR.sgl;
       8: nResult := BufR.dbl;
      10: nResult := BufR.ext;
    else
      raise Exception.Create('HexToFloat conversion error');
    end;
    nResult := nResult * -1;

    nResult := RoundCurrency(nResult, 4);
    if ABS(nResult) > 9999999999999 then begin
      nResult := 0;
    end;
    pValue := nResult;
  except
    on e: Exception do begin
      sTemp := '';
      for i:= 1 to Length(pData) do begin
        sTemp := sTemp + IntToHex(ord(pData[i]), 2);
      end;
    end;
  end;
end;
jetzt würde ich das ganze umgekehrt benötigen. Wer kann mir dabei helfen?

Der schöne Günther 25. Apr 2013 09:28

AW: Zahl wieder in String umwandeln
 
Ohne den konkreten Quelltext jetzt im Detail studiert und/oder verstanden zu haben: FormatFloat() hat mir bislang alle meine Wünsche erfüllen können...

Sir Rufo 25. Apr 2013 09:29

AW: Zahl wieder in String umwandeln
 
AFAIK müsste der Compiler hier Warnungen ausgeben, da
Delphi-Quellcode:
sHex20
und
Delphi-Quellcode:
sHex00
nicht initialisiert sind.

Was musst du da umwandeln und warum musst du da was in Hex umwandeln? :gruebel:
(sollen wir den Code jetzt mit allen möglichen Kombinationen füttern und dann per Debugger herausfinden, was da eigentlich passiert um dann dafür eine Umkehrfunktion zu schreiben?)

Blup 26. Apr 2013 09:11

AW: Zahl wieder in String umwandeln
 
Lokale lange Strings und dynamische Arrays werden beim Betreten der Funktion automatisch mit nil also Länge 0 initialisiert.
Deshalb gibt es keine Warnung.

p80286 26. Apr 2013 09:35

AW: Zahl wieder in String umwandeln
 
Als pseudocode formuliert denke ich es sollte ungefähr so aussehen:
type
maxdbl:=sizeof(double);
adbl = array [1..maxdbl] of byte;
padbl=^adbl;

case werttyp of
single : for i:=1 to maxsgl do result:=result+inttohex(pasgl^[i]);
double : for i:=1 to maxdbl do result:=result+inttohex(padbl^[i]);
...

Gruß
K-H

Thomas Feichtner 29. Apr 2013 07:01

AW: Zahl wieder in String umwandeln
 
Hallo,

nach einigen Suchen habe ich es doch gefunden.

Developer Netword

Delphi-Quellcode:
function FloatToHex(const x: double): string; overload;
type tBA = array [0..SizeOf(x)-1] of byte;
var Buf: tBA; i: integer;
begin
  For i := 0 to high(tBA)
    do Buf[high(tBA)-i] := tBA(x)[i];
  Buf[0] := Buf[0] xor $80;
  SetLength(Result,SizeOf(Buf)*2);
  BinToHex(@Buf,PChar(Result),SizeOf(Buf));
end;
Bei den Daten die ich auslesen muss lag es noch daran, dass der Wert mit * - 1 multipliziert werden musste.

Sir Rufo 29. Apr 2013 07:25

AW: Zahl wieder in String umwandeln
 
IMHO ist die Umsetzung ein Paradebeispiel für Don't do that at home

Verstehen würde ich ja die Basis-Funktionen
Delphi-Quellcode:
BinToFloat
und
Delphi-Quellcode:
FloatToBin
um diese dann in den Wrapper-Funktionen
Delphi-Quellcode:
HexToFloat
und
Delphi-Quellcode:
FloatToHex
zu verwenden.

Aber so wird das weder DRY noch KISS :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz