AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zahl wieder in String umwandeln

Ein Thema von Thomas Feichtner · begonnen am 25. Apr 2013 · letzter Beitrag vom 29. Apr 2013
Antwort Antwort
Thomas Feichtner

Registriert seit: 30. Nov 2007
Ort: Rum
137 Beiträge
 
Delphi 10.4 Sydney
 
#1

Zahl wieder in String umwandeln

  Alt 25. Apr 2013, 10:11
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?
mfg

Thomas Feichtner
  Mit Zitat antworten Zitat
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Zahl wieder in String umwandeln

  Alt 25. Apr 2013, 10:28
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...
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Zahl wieder in String umwandeln

  Alt 25. Apr 2013, 10:29
AFAIK müsste der Compiler hier Warnungen ausgeben, da sHex20 und sHex00 nicht initialisiert sind.

Was musst du da umwandeln und warum musst du da was in Hex umwandeln?
(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?)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#4

AW: Zahl wieder in String umwandeln

  Alt 26. Apr 2013, 10:11
Lokale lange Strings und dynamische Arrays werden beim Betreten der Funktion automatisch mit nil also Länge 0 initialisiert.
Deshalb gibt es keine Warnung.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Zahl wieder in String umwandeln

  Alt 26. Apr 2013, 10:35
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Thomas Feichtner

Registriert seit: 30. Nov 2007
Ort: Rum
137 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Zahl wieder in String umwandeln

  Alt 29. Apr 2013, 08:01
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.
mfg

Thomas Feichtner
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Zahl wieder in String umwandeln

  Alt 29. Apr 2013, 08:25
IMHO ist die Umsetzung ein Paradebeispiel für Don't do that at home

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

Aber so wird das weder DRY noch KISS
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:54 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