Delphi, konstanter Dezimalseperator

Februar 24th, 2007 Autor: Phillip Kroll -

Borland DelphiWenn 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.

String in Double

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;

Double in String

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;

Bisher keine Kommentare für diesen Eintrag...

0 response(s) to Delphi, konstanter Dezimalseperator

    Kommentare sind für diesen Beitrag geschlossen.