AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

inifile ReadFloat deutsch/english formatsettings

Ein Thema von bernhard_LA · begonnen am 14. Jul 2021 · letzter Beitrag vom 16. Jul 2021
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.613 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#11

AW: inifile ReadFloat deutsch/english formatsettings

  Alt 14. Jul 2021, 18:47
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.
Thomas Mueller
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.057 Beiträge
 
Delphi 2009 Professional
 
#12

AW: inifile ReadFloat deutsch/english formatsettings

  Alt 14. Jul 2021, 21:46
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;
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.447 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: inifile ReadFloat deutsch/english formatsettings

  Alt 15. Jul 2021, 11:50
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.

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?
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
647 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: inifile ReadFloat deutsch/english formatsettings

  Alt 15. Jul 2021, 12:20
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.
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.057 Beiträge
 
Delphi 2009 Professional
 
#15

AW: inifile ReadFloat deutsch/english formatsettings

  Alt 15. Jul 2021, 12:29
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.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
jziersch

Registriert seit: 9. Okt 2003
Ort: München
251 Beiträge
 
Delphi 10.4 Sydney
 
#16

AW: inifile ReadFloat deutsch/english formatsettings

  Alt 15. Jul 2021, 12:55
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;
WPCubed GmbH
Komponenten für Delphi:
WPTools, wPDF, WPViewPDF
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: inifile ReadFloat deutsch/english formatsettings

  Alt 15. Jul 2021, 13:13
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
647 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: inifile ReadFloat deutsch/english formatsettings

  Alt 15. Jul 2021, 16:45
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.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.447 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: inifile ReadFloat deutsch/english formatsettings

  Alt 15. Jul 2021, 17:43
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: inifile ReadFloat deutsch/english formatsettings

  Alt 15. Jul 2021, 18:37
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 22:15 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