![]() |
AW: Floattostr wandelt Komma in #0
Zitat:
Nun - das mit den Formatsettings ist der entscheidende Tipp gewesen. Dort steht als Dezimaltrenner tatsächlich #0 drin, wobei ich mir nicht erklären kann, an welcher Stelle das geändert worden sein kann. Ich habe nun Deinen Hinweis mit der Definition des Dezimaltrenners vor die Funktion gesetzt und alles ist gut. Jetzt spuckt der Parser, aber das ist das Folgeproblem, auf das Du an dieser Stelle hingewiesen hast. Ich denke, wir können den Thread hiermit zumachen. Danke für Eure Tipps. Gruß Ingo |
AW: Floattostr wandelt Komma in #0
Zitat:
Es wird nicht umsonst gesagt, daß globale Variablen böse sind. Und man sollte niemals grundlos an globalen Settings rumschrauben. :warn: Zuerst suchst du mal, wo dein Setting kaputt geht und reparierst das. Und dann benutzt du dort, wo du selber mit einem "Sonderformat" hantierst, den Settings-Parameter der jeweiligen Umwandlungsfunktionen. ![]() |
AW: Floattostr wandelt Komma in #0
Ich habe jetzt eine Funktion ausgeklammert, die die Ergebnisse der Berechnung mit SMExport-Komponenten abspeichert. Die scheint in ihren Tiefen eine Umformatierung des Settings vorzunehmen. Werde den Support von Scalabium dazu befragen. Merkwürdig nur, dass das mit einem Mal so auftaucht und bisher in keinem anderen Projekt Probleme verursacht hat.
Gruß Ingo |
AW: Floattostr wandelt Komma in #0
Zitat:
Selbst wenn da irgendwo in den Tiefen eine Änderung vorgenommen wird, wenn man mit eigenen TFormatSettings arbeitet, erlebt man keine Überschungen. |
AW: Floattostr wandelt Komma in #0
Sicher sind die einfachen Funktionen schon.
Wenn man eine Zahl so ausgibt und auch so wieder einliest, dann gibt es keine Probleme, da ja das selbe Setting wieder benutzt wird. Wenn man aber ein bestimmtes Format benötigt oder wenn man Daten speichern, bzw. übertragen (anderes Programm/Rechner) will, dann muß man Dieses immer in einem definierten Format tun. (oder muß das Format mit übergeben, bei Speicherung/Übertragung) |
AW: Floattostr wandelt Komma in #0
Zitat:
Das Programm läuft nun, nachdem ich in meiner Funktion vor FloatToStr die Separatoren umsetze. Allerdings musste ich dasselbe im Formelparser machen, weil dort StrToFloat aufgerufen wird. Das ging durch die Anpassungen auch in die Hose. |
AW: Floattostr wandelt Komma in #0
Es gibt überladene Versionen der <Typ>To<Typ> bzw. Try<Typ>To<Typ> welche man das Format als weiteren Parameter mitgeben kann.
![]() |
AW: Floattostr wandelt Komma in #0
Also, zum Glück nicht die des Systems, sondern nur die des Programms (EXE), solange wie diese läuft.
Beim nächsten Programmstart werden die Einstellungen vom System ausgelesen und in das programm-globale FormatSettings geschrieben/kopiert. Achtung, wenn man mit der VCL/FMX arbeitet (nicht in der Console, da dort keine Messages verarbeitet werden), dann reagiert Delphi z.B. auf WM_INICHANGE, welches vom Windows an alle Programme verschickt wird, wenn jemand z.B. diese Settings im Windows ändert, und läd die Einstellungen neu. (hast du das global geändert, ist es danach wieder weg) |
AW: Floattostr wandelt Komma in #0
Zitat:
Zuerst, nicht alles was ein T am Anfang hat ist eine Klasse. TFormatSettings ist hier ein Record:
Delphi-Quellcode:
Eigentlich ist das Beispiel was ich am Anfang geschrieben habe nicht ganz korrekt, denn bei
type
TFormatSettings = record CurrencyFormat: Byte; NegCurrFormat: Byte; ThousandSeparator: Char; DecimalSeparator: Char; CurrencyDecimals: Byte; DateSeparator: Char; TimeSeparator: Char; ListSeparator: Char; CurrencyString: string; ShortDateFormat: string; LongDateFormat: string; TimeAMString: string; TimePMString: string; ShortTimeFormat: string; LongTimeFormat: string; ShortMonthNames: array[1..12] of string; LongMonthNames: array[1..12] of string; ShortDayNames: array[1..7] of string; LongDayNames: array[1..7] of string; TwoDigitYearCenturyWindow: Word; end;
Delphi-Quellcode:
steht in fs nur Müll. Auf jeden Fall nicht die in Deutschland gültigen Ländereinstellungen. Sollte man nicht machen, man sollte zuerst GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, fs); aufrufen. Das ist aber in dem Fall nicht so wichtig, denn mit der Zeile
var
d: Double; fs: TFormatSettings; s: string; begin d := 4.5887305339; fs.DecimalSeparator := ','; s := FloatToStr(d, fs);
Delphi-Quellcode:
habe ich den für mich wichtigen Wert angepasst. Und wenn ich es nun mitschicke, weiß FloatToStr, dass ich ein Komma als Dezimalseparator ansehe. Danach kann ich den fs Record vergessen. Es gab keine Änderungen irgendwo, nur in fs.
fs.DecimalSeparator := ',';
Zitat:
|
AW: Floattostr wandelt Komma in #0
Zitat:
Ohne Parameter mit den aktullen Systemeinstellungen und mit einem Parameter kann man auch direkt ein bestimmtes Setting laden. (aus den Sprachen/Locales, welche dein Windows kennt) Den Record kann man sich in seine Variable kopieren (
Delphi-Quellcode:
) oder direkt in den Parameter reingeben.
:=
Im Notfall reicht es, wenn man "nur" die Felder des Records füllt, welche die jeweilige Funktion verwenden/benötigen. Bei Integer/Floatwerten wären es das Komma und das Tausenderzeichen, für Currency zusätzlich auch noch die 3 Werte Geld-Felder, für Datumsfunktionen die Datums- und Zeitfelder usw. Aber man hätte natürlich auch mal ganz einfach in die OH zu schauen brauchen. :roll: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:51 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