Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Variant -> Float. FormatSettings steuerbar? (https://www.delphipraxis.net/184162-variant-float-formatsettings-steuerbar.html)

Der schöne Günther 4. Mär 2015 10:33

Delphi-Version: XE7

Variant -> Float. FormatSettings steuerbar?
 
Folgender Code
Delphi-Quellcode:
procedure funWithVariants();
var
   myVariant:   OleVariant;
   myFloat:   Single;
begin
   myVariant := '3.14'; // Deutsche FormatSettings sind aktiv
   myFloat := myVariant;
   WriteLn( myFloat.ToString() ); // Ergibt 314
end;
schreibt "314" statt "3,14" in die Ausgabe. Der implizite Cast von Variant auf Single wirft keine Fehler und ergibt 314. Kann ich hier etwas dagegen tun? Kann ich ihm sagen, dass er bestimmte FormatSettings nehmen soll?

Ich habe in
Delphi-Quellcode:
System.Variants
und
Delphi-Quellcode:
System.VarUtils
nichts gefunden das mir weiterhilft...

PS: Die Werte-Eingaben kommen von außerhalb, auf die habe ich keinen Einfluss. Die sind immer mit "."-Trennzeichen.

PPS: Ja, das Thema ist stark verwandt mit http://www.delphipraxis.net/138610-z...tml#post941518

himitsu 4. Mär 2015 11:00

AW: Variant -> Float. FormatSettings steuerbar?
 
Variant und ToString nimmt die globalen Einstellungen (SysUtils.FormatSettings).
  • entweder global das Setting umstellen
  • den VariantManager umbauen und eigene Converter einbauen (auch global, aber nur für Variants)
  • die Umwandlung Variant <> Float selber vornehmen (FloatToVar/VarToFloat)
  • oder nicht Variant verwenden

Der schöne Günther 4. Mär 2015 11:17

AW: Variant -> Float. FormatSettings steuerbar?
 
Mann, alleine da brauche ich schon Hilfe :oops:

Das einfachste: Die globale Variable
Delphi-Quellcode:
FormatSettings
umstellen. So richtig?

Delphi-Quellcode:
procedure funWithVariants2();
var
   myVariant:  OleVariant;
   myFloat:  Single;
begin
   FormatSettings.DecimalSeparator := '.';
   //FormatSettings := TFormatSettings.Create(LOCALE_INVARIANT); // Auch nicht besser

   myVariant := '3.14';
   myFloat := myVariant;
   WriteLn( myFloat.ToString() ); // Ergibt 314
end;
Ergibt immer noch 314


Du hast im oben verlinkten Thema schon einmal davon gesprochen, global das implizite Casten von Varianten anpassen zu können. Ich habe so etwas noch nie gesehen, hast du ein Beispiel?

BadenPower 4. Mär 2015 11:19

AW: Variant -> Float. FormatSettings steuerbar?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1292283)
schreibt "314" statt "3,14" in die Ausgabe. Der implizite Cast von Variant auf Single wirft keine Fehler und ergibt 314. Kann ich hier etwas dagegen tun? Kann ich ihm sagen, dass er bestimmte FormatSettings nehmen soll?

Wenn die FormatSettings schon deutsch sind, dann must Du auch dem OleVariant eine "deutsche" Variante geben. also '3,14' und nicht '3.14'.

Der schöne Günther 4. Mär 2015 11:21

AW: Variant -> Float. FormatSettings steuerbar?
 
Das sind aber Daten die ich mit einer anderen Gegenstelle austausche und die liegt im einem aktiven Vulkan auf Feuerland-Mitte. Die schreiben ihre Zahlen so wie es alle Computerprogramme der Welt tun.

Heißt: Darauf habe ich keinen Einfluss.

Ich versuche erst einmal den Weg der geringsten Arbeit und möchte das Konvertieren der Varianten anpassen.

BadenPower 4. Mär 2015 11:29

AW: Variant -> Float. FormatSettings steuerbar?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1292303)
Das sind aber Daten die ich mit einer anderen Gegenstelle austausche

Das kann aber keiner aus Deinem geposteten "ProblemCode" herauslesen.

Der schöne Günther 4. Mär 2015 11:31

AW: Variant -> Float. FormatSettings steuerbar?
 
Ich hätte eher gedacht es sei der Normalfall dass man seine Anwendung nicht auf den deutschsprachigen Raum beschränkt. Aber du hast Recht, ich schreibe das noch dazu.

himitsu 4. Mär 2015 12:16

AW: Variant -> Float. FormatSettings steuerbar?
 
Früher war es mal System.VariantManager.VarToReal, aber die Deklaration gibt es zwar nocht, allerdings machen sie absolut garnichts. (nichtmal eine Fehlermeldung)
Delphi-Quellcode:
procedure GetVariantManager(var VarMgr: TVariantManager);
begin
  FillChar(VarMgr, sizeof(VarMgr), 0);
end;

procedure SetVariantManager(const VarMgr: TVariantManager);
begin
end;

function IsVariantManagerSet: Boolean;
begin
  Result := False;
end;
Nun ist es in VarUtils.VarR8FromStr zu finden und das wird mit VAR_LOCALE_USER_DEFAULT (aka LOCALE_USER_DEFAULT) aufgerufen. (wäre zu schön, wenn Variant immer mit der selben Sprache arbeiten würde ... überall)

Geht also doch nicht mehr auf FormatSettings zurück. :wall:
Somit müsste man also statt FormatSettings für den Prozess die Lokalisierung ändern. :gruebel: (Delphi aktualisiert das FormatSettings dann entsprechend)


Oder du änderst in VarUtils die entsprechenden Übersetungsfunktionen. (musste auch erstmal suchen, wo das jetzt liegt, da man dem deprecated natürlich keinen Hinweistext mitgegeben hat. :wall:)

Der schöne Günther 4. Mär 2015 12:41

AW: Variant -> Float. FormatSettings steuerbar?
 
Danke für die Hilfe soweit! :thumb:

Die Prozesslokalisierung hatte ich schon mit
Delphi-Quellcode:
Winapi.Windows.SetThreadLocale(LOCALE_INVARIANT);
versucht, aber das hatte leider keine Auswirkungen.

Ich komme noch nicht ganz dahinter, wie ich in
Delphi-Quellcode:
System.VarUtils
die Funktionen (
Delphi-Quellcode:
VarR8FromStr
, ...) ändern könnte: VarR8FromStr wird ja beispielsweise fest mit
Delphi-Quellcode:
VAR_LOCALE_USER_DEFAULT
aufgerufen. Soll heißen: Ich bastele mir ein eigenes VarR8FromStr das die übergebene Locale ignoriert und immer
Delphi-Quellcode:
LOCALE_INVARIANT
nimmt?

Könnte es einen Grund geben, dass die Varianten sich nicht um die FormatSettings scheren? Mir fällt nichts ein...


PS: Gesagt, getan. Hey, auf den ersten Blick sieht das super aus. Danke für die Hilfe soweit, damit komme ich hoffentlich alleine weiter!


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:04 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