Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi "." oder "," - Wie herausfinden? (https://www.delphipraxis.net/70348-oder-wie-herausfinden.html)

Overburn 29. Mai 2006 09:32


"." oder "," - Wie herausfinden?
 
Moin moin,
ich hab folgnedes Problem:
Muss ein Programm schreiben, das Dateien mit einer bestetimmten Struktur einliest und grafisch ausgibt.
Das Problem ist aber:
Mal sind Kommzahlen in dieser Datei mit einen Punkt und mal mit einem Komma getrennt.
Also steht in einer Datei z.b.: "1.45" und in einer anderen "1,45".
Mein problem ist, das ich noch keine Lösung gefunden habe den "DecimalSeperator" dynamisch anzupassen.
Habt ihr da eine Idee?
Gruß,
Stefan

Klaus01 29. Mai 2006 09:43

Re: "." oder "," - Wie herausfinden?
 
Guten Morgen,

liest Du die Zahlen als String ein?
Dann prüfe doch auf '.' und wenn ein Punkt vorhanden ist
ersetze ihn durch ein Komma.
Dazu kannst Du StringReplace verwenden.

Grüße
Klaus

hanspeter 29. Mai 2006 10:20

Re: "." oder "," - Wie herausfinden?
 
Das Problem habe ich bei der Eingabeverarbeitung ständig.
Dafür habe ich dann eine kleine Routine, welche mir die Eingabe aus einem String aufbereitet.

Gruß Peter
Delphi-Quellcode:
Function ReadFloat(buf : String) : Extended;
var Konv : String;
    i,n  : Integer;
Begin
 buf := Trim(buf);
 result:=0;
 n := length(Trim(buf));
 if n=0 then Exit;
 While (n > 0) and (buf[n]<>'.') and (buf[n]<>',') do dec(n);
 if n > 0 then buf[n] := DecimalSeparator;
 dec(n);
 While (n>0) do Begin
                 if (buf[n]='.') or (buf[n]=',') then buf[n]:=' ';
                 dec(n);
                end;

 konv:='';
 for i:=1 to length(buf) do
    if buf[i] in ['0'..'9',DecimalSeparator,'+','-'] then konv:=konv+buf[i];
 if length(Konv)=0 then Exit;
 try
  result:=strtofloat(Konv);
 except
  on E: EConvertError do result:=0;
 end;

end;

pszopp 29. Mai 2006 10:30

Re: "." oder "," - Wie herausfinden?
 
Wie klappts damit?

Delphi-Quellcode:
function ConvertStr(const aStr : String) : Double;
var OldSep : Char;
begin
  try
    Result := StrToFloat(aStr);
  except
    OldSep := DecimalSeparator;
    if (OldSep = '.') then begin
      DecimalSeparator := ',';
    end
    else begin
      DecimalSeparator := '.';
    end;
   
    Result := StrToFloat(aStr);
    DecimalSeparator := OldSep;

  end; // try
end; // ConvertStr
Gruß,
pszopp

marabu 29. Mai 2006 10:43

Re: "." oder "," - Wie herausfinden?
 
Hallo,

ich hätte da noch eine universell verwendbare Funktion anzubieten:

Delphi-Quellcode:
function Translate(const s, sOld, sNew: String): String;
var
  i, iPos, iLen: integer;
begin
  SetLength(Result, Length(s));
  iLen := 0;
  for i := 1 to Length(s) do
  begin
    iPos := Pos(s[i], sOld);
    if iPos > Length(sNew) then
      Continue;
    Inc(iLen);
    if iPos > 0
      then Result[iLen] := sNew[iPos]
      else Result[iLen] := s[i];
  end;
  SetLength(Result, iLen);
end;
Testen kann man so:

Delphi-Quellcode:
var
  ds, s: String;
  e: Extended;
begin
  ds := StringOfChar(DecimalSeparator, 2);
  s := '';
  while InputQuery('Check', 'Float', s) do
    if TryStrToFloat(Translate(s, '.,', ds), e)
      then ShowMessage(Format('%g', [e]))
      else ShowMessage('bad value');
end;
Grüße vom marabu

Overburn 29. Mai 2006 13:20

Re: "." oder "," - Wie herausfinden?
 
Moin!
Danke für eure Hilfe! :-)
Funktioniert alles wunderbar.

Gruß,
Overburn


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:47 Uhr.

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