Wenn man Anwendungen entwickeln möchte die nicht nur die nicht nur für den eigenen Rechner gedacht sind, sollte man dafür sorgen, dass man einen konstanten Dezimalseperator verwendet. Ansonsten ist man abhängig von der Ländereinstellung des aktuellen Computers. Das führt dazu, dass Funktionen die Gleitkommazahlen in Strings (z.B. FormatFloat( '0.0', 1.5 )) umwandeln, verschiedene Ausgaben produzieren: 1.5 oder 1,5.
Die Probleme die auftreten, wenn man die Strings wieder in eine Gleitkommazahl umwandeln will sind offensichtlich. Um den Dezimalseperator unabhängig von den Ländereinstellungen zu halten reicht folgender Code:
procedure TMainForm.FormCreate(Sender: TObject);
begin
SysUtils.DecimalSeparator := '.';
SysUtils.ThousandSeparator := ',';
end;
Da die Umwandlung eines Strings in eine Zahl immer ein kritischer Codeabschnitt ist empfiehlt es sich, Methoden die Gleitkommazahlen umwandeln, nochmal zu kapseln. So hat man einen einzigen kritischen Abschnitt und nicht dutzende über mehrere Units verteilt. Außerdem kann man so eigene Exceptions werfen und garantieren, dass der Seperator stimmt.
function PStrToDouble( Str : String ) : Double;
begin
SysUtils.DecimalSeparator := '.';
try
Result := SysUtils.StrToFloat( Str );
Except
Result := 0;
if Str = '' then
RAISE EParsingException.Create( Str, 'Fehler beim Versuch, einen leeren String in eine Gleitpunktzahl umzuwandeln.' )
else
RAISE EParsingException.Create( Str, 'Fehler beim Versuch, einen String in eine Gleitpunktzahl umzuwandeln.' );
end;
end;
function PDoubleToStr( Format : String; value : double ) : String;
begin
SysUtils.DecimalSeparator := '.';
Result := FormatFloat( Format, Value );
end;
EParsingException ist hier eine von Exception abgeleitete Klasse die eine komfortabel Möglichkeit bietet um Fehler, die beim Parsen auftreten können zu behandeln.
An der folgenden Deklaration kann man die Funktionalität ablesen:
type
EParsingException = class( Exception )
public
ErrorMessage : String;
Constructor Create( Source : String ); overload;
Constructor Create( Source : String; AdditionalMessage : String ); overload;
end;
This entry was posted on Feb 24, 2007 at 09:42:06 and is filed under Delphi. You can follow any responses to this entry through the RSS 2.0 feed, or leave a response (below) .
Bisher keine Kommentare für diesen Eintrag...
Kommentare sind für diesen Beitrag geschlossen.