AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Variant -> Float. FormatSettings steuerbar?
Thema durchsuchen
Ansicht
Themen-Optionen

Variant -> Float. FormatSettings steuerbar?

Ein Thema von Der schöne Günther · begonnen am 4. Mär 2015 · letzter Beitrag vom 4. Mär 2015
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Variant -> Float. FormatSettings steuerbar?

  Alt 4. Mär 2015, 11:33
Delphi-Version: XE7
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 System.Variants und 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

Geändert von Der schöne Günther ( 4. Mär 2015 um 12:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#2

AW: Variant -> Float. FormatSettings steuerbar?

  Alt 4. Mär 2015, 12:00
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Variant -> Float. FormatSettings steuerbar?

  Alt 4. Mär 2015, 12:17
Mann, alleine da brauche ich schon Hilfe

Das einfachste: Die globale Variable 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?
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#4

AW: Variant -> Float. FormatSettings steuerbar?

  Alt 4. Mär 2015, 12:19
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'.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Variant -> Float. FormatSettings steuerbar?

  Alt 4. Mär 2015, 12:21
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.
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#6

AW: Variant -> Float. FormatSettings steuerbar?

  Alt 4. Mär 2015, 12:29
Das sind aber Daten die ich mit einer anderen Gegenstelle austausche
Das kann aber keiner aus Deinem geposteten "ProblemCode" herauslesen.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Variant -> Float. FormatSettings steuerbar?

  Alt 4. Mär 2015, 12:31
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#8

AW: Variant -> Float. FormatSettings steuerbar?

  Alt 4. Mär 2015, 13:16
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.
Somit müsste man also statt FormatSettings für den Prozess die Lokalisierung ändern. (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. )
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 4. Mär 2015 um 13:20 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Variant -> Float. FormatSettings steuerbar?

  Alt 4. Mär 2015, 13:41
Danke für die Hilfe soweit!

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

Ich komme noch nicht ganz dahinter, wie ich in System.VarUtils die Funktionen (VarR8FromStr , ...) ändern könnte: VarR8FromStr wird ja beispielsweise fest mit VAR_LOCALE_USER_DEFAULT aufgerufen. Soll heißen: Ich bastele mir ein eigenes VarR8FromStr das die übergebene Locale ignoriert und immer 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!

Geändert von Der schöne Günther ( 4. Mär 2015 um 13:49 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:53 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