Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   inifile ReadFloat deutsch/english formatsettings (https://www.delphipraxis.net/208319-inifile-readfloat-deutsch-english-formatsettings.html)

dummzeuch 14. Jul 2021 17:47

AW: inifile ReadFloat deutsch/english formatsettings
 
Da mich das auch immer genervt hat, habe ich vor Ewigkeiten die TIniFile_TryReadFloat und TIniFile_ReadFloat Hilfsfunktionen geschrieben, die dieses Problem lösen. Zusammen mit TIniFile_WriteFloat, welche immer mit Dezimalpunkt schreibt, sind diese Funktionen Teil der Unit u_dzClassUtils meiner dzlib.

Redeemer 14. Jul 2021 20:46

AW: inifile ReadFloat deutsch/english formatsettings
 
Ich habe meine Anwendung so umgestellt, dass der Speicher als Int64 interpretiert wird, wenn ich ein TDateTime speichern oder lesen möchte.

Delphi-Quellcode:
type TJanniINIFile = class helper for TIniFile
  public
    constructor CreateForceFile(const FileName: string); // Erstellt gegebenenfalls den Ordner
    procedure WriteDouble(const Section, Ident: string; const Value: Double); // Mein Versuch, TDateTime regionsunabhängig zu schreiben
    function ReadDouble(const Section, Ident: string; const Default: Double): Double;
end;

{ TJanniINIFile }

constructor TJanniINIFile.CreateForceFile(const FileName: string);
begin
  ForceDirectories(ExtractFilePath(Filename));
  Create(FileName);
end;

function TJanniINIFile.ReadDouble(const Section, Ident: string;
  const Default: Double): Double;
var
  Pointer: PDouble;
  Pointer2: PInt64;
  Int: Int64;
begin
  Pointer2 := @Default;
  Int := StrToInt64Def(ReadString(Section, Ident, ''), Pointer2^);
  Pointer := @Int;
  Result := Pointer^;
end;

procedure TJanniINIFile.WriteDouble(const Section, Ident: string;
  const Value: Double);
var
  Pointer: PInt64;
begin
  Pointer := @Value;
  WriteString(Section, Ident, IntToStr(Pointer^));
end;

freimatz 15. Jul 2021 10:50

AW: inifile ReadFloat deutsch/english formatsettings
 
Pointer sind bei uns - zum Glück - zu Recht - verboten.
Wenn es um Datum geht würde ich das in ANSI-Format speichern. Aber Fragenden ging es wohl um "normale" Double.

Zitat:

Zitat von himitsu (Beitrag 1492272)
Erstmal ist es totaler Schwachsinn, dass INIs überhaupt lokalisiert gespeichert/gelesen werden.
(aber für INIs gibt es ja leider auch eigentlich keine globale einheitliche Konvention/Richtline/Norm/...)

Ist das bei XML und/oder JSON anders?

Rolf Frei 15. Jul 2021 11:20

AW: inifile ReadFloat deutsch/english formatsettings
 
Ja. XML kann über einen Header bestimmt werden, was für eine Codierung gilt. Ohne den Header ist es per Definition UTF-8. JSON ist nach meinem Wissenstand per Definition immer UTF-8.

Redeemer 15. Jul 2021 11:29

AW: inifile ReadFloat deutsch/english formatsettings
 
Zitat:

Zitat von Rolf Frei (Beitrag 1492338)
Ja. XML kann über einen Header bestimmt werden, was für eine Codierung gilt. Ohne den Header ist es per Definition UTF-8. JSON ist nach meinem Wissenstand per Definition immer UTF-8.

Um Zeichenkodierung geht es hier nicht.

jziersch 15. Jul 2021 11:55

AW: inifile ReadFloat deutsch/english formatsettings
 
Hier als Lösungsvorschlag eine Funktion ConvertStr um einen String in ein Double zu verwandeln
und dabei . und , alternativ zu akzeptieren sowie spaces zu ignorieren.
Um INI Dateien zu lesen meiner Ansicht nach recht zweckmässig, um beim Start eines Programmes Exceptions zu vermeiden.


Code:
function ConvertStr( const str : string ) : Double;
var i : Integer;
    fNeg, fDez : Boolean;
    c : Char;
    fN, fDD : Double;
begin
      fN := 0;
      fNeg := FALSE;
      fDez := FALSE;
      fDD := 10;
      for i := 1 to Length(str) do
      begin
        c := str[i];
        if c = '-' then fNeg := not fNeg
        else if c = '.' then fDez := true
        else if c = ',' then fDez := true
        else if c in ['0'..'9'] then
        begin
          if fDez then
          begin
            fN := fN + (Integer(c) - Integer('0'))/fDD;
            fDD := fDD * 10;
          end else
          begin
            fN := fN * 10 + (Integer(c) - Integer('0'));
          end;
        end
        // Wenn auskommentiert werden unerwartete Zeichen einfach ignoriert
        // else break
        ;
      end;
      if fNeg then Result := -fN
      else Result := fN;
end;

himitsu 15. Jul 2021 12:13

AW: inifile ReadFloat deutsch/english formatsettings
 
XML nein, da sind Floats garnicht gefiniert (alles als String und das Format ist nicht vorgegeben)

aber JSON ja, denn dort ist ALLES ganz genau definiert, zumindestens bei Sting, Boolean, Integer und Float. (fast, denn beim Datum gibt es zwar indirekt eine Quasi-Vorgabe, aber Datum als "Typ" gibt es das per-se nicht)
https://www.json.org/json-de.html

Rolf Frei 15. Jul 2021 15:45

AW: inifile ReadFloat deutsch/english formatsettings
 
Zitat:

Zitat von Redeemer (Beitrag 1492341)
Zitat:

Zitat von Rolf Frei (Beitrag 1492338)
Ja. XML kann über einen Header bestimmt werden, was für eine Codierung gilt. Ohne den Header ist es per Definition UTF-8. JSON ist nach meinem Wissenstand per Definition immer UTF-8.

Um Zeichenkodierung geht es hier nicht.

Ja hast natürlich recht. Hatte gedacht weil es um definierte Vorgaben geht. Wenn man aber Doubles,Floats, etc. speichert sollten diese der ANSI Regeln für die Zahlandrestellung nutzen oder multipliziren mit 100 oder sawas. Bei allen XML die ich bisher verabreiten musste, wurde vom Interface (Producer des XML) vorgegeben, dass es mit 100 Multipliziert werden muss (im Fall von Geldbeträgen) oder aber der Punkt als Pflicht vorgegeben ist. Bei Datumsangaben ist es übrignesn das selbe. Die Daten in lokalen Format zu speichern ist aber auf jeden Fall unzulässig und falsch.

freimatz 15. Jul 2021 16:43

AW: inifile ReadFloat deutsch/english formatsettings
 
Und was sind die ANSI-Regeln für Zahlendarstellung?
Wen ich google nach "ansi Zahlendarstellung" komme ich z.B. auf https://de.wikipedia.org/wiki/IEEE_754

himitsu 15. Jul 2021 17:37

AW: inifile ReadFloat deutsch/english formatsettings
 
IEEE754 ist für das interne Speicherformat innerhalb des Speichers.

Aber passend zu diesem Format gibt es.
https://www.oreilly.com/library/view...2521/re67.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:02 Uhr.
Seite 2 von 3     12 3      

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