![]() |
Delphi-Version: XE7
Variant -> Float. FormatSettings steuerbar?
Folgender Code
Delphi-Quellcode:
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?
procedure funWithVariants();
var myVariant: OleVariant; myFloat: Single; begin myVariant := '3.14'; // Deutsche FormatSettings sind aktiv myFloat := myVariant; WriteLn( myFloat.ToString() ); // Ergibt 314 end; Ich habe in
Delphi-Quellcode:
und
System.Variants
Delphi-Quellcode:
nichts gefunden das mir weiterhilft...
System.VarUtils
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 ![]() |
AW: Variant -> Float. FormatSettings steuerbar?
Variant und ToString nimmt die globalen Einstellungen (SysUtils.FormatSettings).
|
AW: Variant -> Float. FormatSettings steuerbar?
Mann, alleine da brauche ich schon Hilfe :oops:
Das einfachste: Die globale Variable
Delphi-Quellcode:
umstellen. So richtig?
FormatSettings
Delphi-Quellcode:
Ergibt immer noch 314
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; 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? |
AW: Variant -> Float. FormatSettings steuerbar?
Zitat:
|
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. |
AW: Variant -> Float. FormatSettings steuerbar?
Zitat:
|
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.
|
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:
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)
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; 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:) |
AW: Variant -> Float. FormatSettings steuerbar?
Danke für die Hilfe soweit! :thumb:
Die Prozesslokalisierung hatte ich schon mit
Delphi-Quellcode:
versucht, aber das hatte leider keine Auswirkungen.
Winapi.Windows.SetThreadLocale(LOCALE_INVARIANT);
Ich komme noch nicht ganz dahinter, wie ich in
Delphi-Quellcode:
die Funktionen (
System.VarUtils
Delphi-Quellcode:
, ...) ändern könnte: VarR8FromStr wird ja beispielsweise fest mit
VarR8FromStr
Delphi-Quellcode:
aufgerufen. Soll heißen: Ich bastele mir ein eigenes VarR8FromStr das die übergebene Locale ignoriert und immer
VAR_LOCALE_USER_DEFAULT
Delphi-Quellcode:
nimmt?
LOCALE_INVARIANT
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 01:35 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-2025 by Thomas Breitkreuz