TINIFile und Zahlenformate

Für sonstige Unterhaltungen, welche nicht direkt mit Lazarus zu tun haben
Antworten
Benutzeravatar
photor
Beiträge: 443
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 2.2.6 FPC 3.2.2 (Gtk2)
CPU-Target: 64Bit

TINIFile und Zahlenformate

Beitrag von photor »

Hallo Forum,

ich poste hier im "Dies-und-Das"-Bereich weil es nicht direkt um Lazarus geht - sondern eher um Delphi (Seattle).

Das Problem tritt bei Delphi (unter Windows natürlich) auf. Es geht um INI-Files, die genutzt werden, um Projekt- und Setup-Parameter für (aufwändigere) Rechnungen zu speichern und wieder zu laden - das geht grundsätzlich auch sehr gut.

Das Programm wird im internationalen Umfeld eingesetzt, so dass Floats z.B. am besten im US-Format - also mit '.' als Dezimaltrenner gespeichert werden (sollten). Jetzt gibt es immer mal Kollegen, die eine DE- statt der US-Einstellung als Formateinstellung für Zahlen- und Datumsformate im Windows Desktop nutzen, was dazu führt, dass man im Programm eine Meldung "1,23 is not a valid float" (also mit ','). Und das, obwohl im INI-File eindeutig '1.23' (mit '.') steht. Das ist ärgerlich (irgendwas passiert also beim Einlesen oder später beim Umwandeln des Strings in ein Float).

Ich frage mich, ob und wie ich dem von Programm-Seite Herr werden könnte - um einfach auchg den verärgerten Nutzer zu vermeiden.

Unter Lazarus geht folgendes:

Code: Alles auswählen

const
  DATETIMEFORMATSTR = 'yyyy"-"mm"-"dd hh":"mm":"ss';

procedure LoadINI(const Filename: string; var PD: TBMSCProject);
var
  Section, DataStr: String;
  DataInt: integer;
begin
  INI := TMemINIFile.Create(Filename);

  try
    // set format to dedicated international engineering style
    INI.FormatSettings.DecimalSeparator := '.';
    INI.FormatSettings.DateSeparator := '-';
    INI.FormatSettings.ShortDateFormat := DATETIMEFORMATSTR;
    
    [...]
    
Man kann also unmittelbar einen entsprechenden DecimalSeparator setzen - und das sollte so funktionieren (konnte nicht alles durchspielen).

Unter Delphi Seattle gibt es die INI.FormatSettings-Struktur für TINIFile bzw. TMemINIFile leider (noch) nicht.

Welche Möglichkeiten gäbe es denn sonst?

Am einfachsten wäre es, wenn der Zahlen-String unverändert übernommen würde und in ein Float gewandelt wird - unabhängig von irgendwelchen Einstellungen. Im INI-File selbst kann ich ja (notfalls mit einem ASCII-Editor) dafür sorgen, dass ein '.' als Dezimaltrenner genutzt wird - eigentlich sollte das Verhalten für Schreiben und Lesen gleich sein. Eventuell das Format selbst auch im INI-File speichern?

Dankbar für jeden Tipp,
Photor

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TINIFile und Zahlenformate

Beitrag von Mathias »

Am besten verwendest du das klassische val und str.
Und in der ini Datei verwendest du nur Strings.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TINIFile und Zahlenformate

Beitrag von af0815 »

Das Problem selbst ist uralt. Ich kenne es seit D5, wo wir angefangen haben Programme in China zu verwenden. :D

Abhilfe: Beim speichern und einlesen das Formatsetting zwischenspeichern, dann ein Format IMMER verwenden und am Ende wieder die Formatsettings zu restaurieren.
Das Zwischenspeichern der Settings ist notwendig, weil das Userinterface ja nicht umgestellt sein soll.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
photor
Beiträge: 443
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 2.2.6 FPC 3.2.2 (Gtk2)
CPU-Target: 64Bit

Re: TINIFile und Zahlenformate

Beitrag von photor »

Mathias hat geschrieben:
Do 17. Nov 2022, 20:14
Am besten verwendest du das klassische val und str.
Und in der ini Datei verwendest du nur Strings.
Ich hatte heute nochmal ein bisschen Ruhe gefunden und in einem anderen (etwas neueren) Programm nachgesehen. Dort nutze ich zum Lesen aus der INI-Datei nur ReadString() bzw. WriteString() zum Schreiben. Anschließend werden die Werte dann mit StrToXXXX() konvertiert.

Wenn ich das richtig weiß(?), dann gibt es zu StrToFloat() eine überladene Variante, der man eine FormatSettings-Variable als zweiten Parameter mitgeben kann. Also ...
af0815 hat geschrieben:
Do 17. Nov 2022, 20:56
Abhilfe: Beim speichern und einlesen das Formatsetting zwischenspeichern, dann ein Format IMMER verwenden und am Ende wieder die Formatsettings zu restaurieren.
Das Zwischenspeichern der Settings ist notwendig, weil das Userinterface ja nicht umgestellt sein soll.
... kann ich doch auch in der Routine, die die INI-Datei schreibt oder liest (das passiert nur an einigen Stellen) lokal(!) eine TFormatSettings-Variable deklarieren, entsprechend besetzen und dann dem StrToFloat() bzw andersrum auch dem FloatToStr() mitgeben.

Das erscheint mir im Moment die brauchbarste Lösung - wenn sie den tut. Nicht soooo elegant (wie z.B. die oben genannte Variante, wie sie in Lazarus implementiert ist), aber egal.

Danke für den Input und das Zuhören.

Ciao,
Photor

Antworten