Autor Beitrag
sky21
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 141

W7
D2010, XE2
BeitragVerfasst: Mi 02.05.07 16:33 
Hi all

Ich möchte, dass meine Delphi Win32 Applikation unter WinXP stets den Punkt als Dezimaltrennzeichen verwendet. Unabhängig der unter Windows eingestellten Regionaleinstellungen.

Der Beste Ansatz ist nun, die 'Global Formatting Variable' von Delphi zu überschreiben. Etwa so:
ausblenden Delphi-Quelltext
1:
DecimalSeparator := '.'					


DAS funktioniert auch gut so, solange man keine Variant Typen hat und das Casten nicht dem Delphi überlässt. Ansonsten geht es nicht!!

check this out:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
// Windows regional settings is set to 'Germany' (-> Separator is by default the comma value...)
var
 v1 : Variant;
 s1 : String;
 s2 : String;
begin

 DecimalSeparator := '.';

 s1 := v1; // auto cast
 s2 := FloatToStr(v1) // explicit cast

 Print(s1); // out: 1,123
 Print(s2); // out: 1.123
end;


Da scheint es in Delphi einen Bug zu geben, beim Cast und der Zuweisung zu s1 scheint Delphi trotzdem die Windows Einstellungen zu verwenden.

Frage: Wie löst man dieses Problem???

Unschöne Lösungen:
-> Überschreiben der Windows Regional Settings (Das ist doof, weil man die Grundeinstellungen des Benutzers nicht verändern möchte)

-> Überall 'FloatToStr()' verwenden (Das ist doof, wenn man Tausende von Codezeilen überprüfen muss...)
Tastaro
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: Mi 02.05.07 17:23 
z.B.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
function floattostr_dot(rRealValue: real): string;
begin
   Result := floattostr(rRealValue);
   Result := stringreplace(Result, DecimalSeparator, '.', [rfReplaceAll]);
end;


Kannst aber auch mal nach FloatToStrF gucken.

Beste Grüße
Tastaro
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mi 02.05.07 19:41 
Der 'DecimalSeparator' aus den SysUtils ist eine Kopie der spezifischen Ländereinstellungen.

Die implizite Typumwandlung des VariantManagers geht über die Windows API. Ich fürchte, es führt kein Weg dran vorbei, die regionalen Einstellungen zu ändern.

Ich würde auch auf so eine implizite Typumwandlung verzichten, wenn ich Du wäre. Ich habe z.B. eine Funktionssammlung, um Variants explizit in die diversen Typen umzuwandeln (VarToBool, VarToStr, VarToInt etc.) Einige Funktionen sind schon vorhanden, andere musste ich mir selbst basteln.

Erst damit kann ich vernünftig mit Variants arbeiten. Vorher hatte ich ständig AVs 'Cannot convert (Null) to String' etc.

Die explizite Konvertierung bedingt auch eine entsprechend kontrollierte Formatierung. Schließlich willst Du ja nicht Dezimalstellen bis der Arzt kommt, oder?

Vielleicht wäre es doch an der zeit, die 100000 Codezeilen zu durchforsten und entsprechend umzustellen.

[edit]
Ich muss mich korrigieren. Offensichtlich geht die Konvertierung nur bei den Typen varCurrency und varDateTime über die Windows-Formatierungsfunktionen.

Die Anweisung:
ausblenden Delphi-Quelltext
1:
MyVariant := 1.23;					

Setzt den 'varType' auf 'varCurrency' und führt zu dem von Dir beobachteten Blödsinn.
Dagegen funktioniert das hier wie erwartet;
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
Var
  MyDouble : Double;

Begin
  MyDouble := 1.23;
  MyVariant := MyDouble;
...



[/edit]

_________________
Na denn, dann. Bis dann, denn.