AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

inifile ReadFloat deutsch/english formatsettings

Ein Thema von bernhard_LA · begonnen am 14. Jul 2021 · letzter Beitrag vom 16. Jul 2021
Antwort Antwort
Seite 1 von 3  1 23   
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.013 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

inifile ReadFloat deutsch/english formatsettings

  Alt 14. Jul 2021, 12:03
Würde gerne mit einem Deutschen Windows PC ( dezimale = 1,2 ) Ini files einlesen die jemand auf einem englischen PC geschrieben hat ( 1.2)
mit der Funktion Ini.ReadFloat(....) .
Was muss ich machen damit ich beide Formate einlesen kann ?


Delphi-Quellcode:
fIni := TIniFile.Create(aFileName);
  try

    X := fIni.ReadFloat(SectionStr, 'x', -99999); // mag nur Komma-Zahlen mit Deutschen Format 1,2 :-(


  finally
    fIni.free;
  end;

Geändert von bernhard_LA (14. Jul 2021 um 12:06 Uhr)
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
573 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: inifile ReadFloat deutsch/english formatsettings

  Alt 14. Jul 2021, 12:11
Als String einlesen und mit StrToFloat umwandeln. Dabei die FormatSettings nach Bedarf setzen.
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.013 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: inifile ReadFloat deutsch/english formatsettings

  Alt 14. Jul 2021, 12:24
gibt's ne Lösung bei der ich nix selber schreiben muss .... eigentlich doch ne Aufgabe der Klasse inifile ......
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.743 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: inifile ReadFloat deutsch/english formatsettings

  Alt 14. Jul 2021, 12:37
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/...)
Und leider kam in den letzten 20 Jahren auch noch keiner auf die Idee eine FormatSettings-Variable in TCustomIniFile für Floats und DateTimes einzufügen.

Fazit:
  • Du mußt, wie schon gesagt wurde, selbst den Float behandeln
    StrToFloat(INI.ReadString(...), DeinFormatSettings)
    • manuell, vor Ort
    • TIniFile ableiten und diese Funktionen überschreiben überdecken
    • oder besser noch einfach mit einem ClassHelper erweitern, z.B. um ein ReadFloatUS
  • oder du stellst das globale FormatSettings in der SysUtils um
    • also entweder vor und nach dem Zugriff auf die INI, vorübergehend (aber ist auch keine gute Idee, da nicht threadsave usw.)
    • oder permanent dein Programm auf Englisch umstellen
      System.SysUtils.FormatSettings := TFormatSettings.Create('en-US');

Aber vielleicht wird das Problem ja im nächsten Jahrtausend behoben sein.
https://quality.embarcadero.com/browse/RSP-17616
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (14. Jul 2021 um 13:25 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: inifile ReadFloat deutsch/english formatsettings

  Alt 14. Jul 2021, 12:49
Oder du machst es dir einmal als class helper und benutzt dann einfach die folgende Unit in deiner uses . Das ist das schwere Los eines Software-Entwicklers, manchmal muss man doch tatsächlich wenigstens noch ein uses tippen.


Delphi-Quellcode:
unit System.IniFiles.TCustomIniFile.Helper;

interface uses System.IniFiles, System.SysUtils;

type
   /// <summary>
   /// Ersetzt die Methode
   /// <c>WriteFloat</c> und deren <i>Read</i>-Gegenstück da die
   /// RTL-Implementation von <c>TCustomIniFile</c> dummerweise
   /// mit den <b>globalen Formatsettings</b> arbeitet
   /// </summary>
   /// <remarks>
   /// Floats werden mit <c>.</c> als <c>DecimalSeparator</c> geschrieben.
   /// </remarks>
   TCustomIniFileHelper = class helper for TCustomIniFile
      protected class var
         internalFormatSettings: TFormatSettings;
      protected
         class constructor Create();
      public
         procedure WriteFloat(const Section, Name: string; Value: Double);
         function ReadFloat(const Section, Name: string; Default: Double): Double;
   end;


implementation

{ TCustomIniFileHelper }

class constructor TCustomIniFileHelper.Create();
begin
   internalFormatSettings := TFormatSettings.Invariant();
end;

function TCustomIniFileHelper.ReadFloat(
   const Section, Name: string;
   Default: Double
): Double;
var
   FloatStr: string;
begin
   FloatStr := ReadString(Section, Name, '');
   Result := Default;
   if FloatStr <> 'then
   try
      Result := StrToFloat(FloatStr, internalFormatSettings);
   except
      on EConvertError do
         Result := inherited ReadFloat(Section, Name, Default);
   else
      raise;
   end;
end;

procedure TCustomIniFileHelper.WriteFloat(
   const Section, Name: string;
   Value: Double
);
begin
   WriteString(Section, Name, FloatToStr(Value, internalFormatSettings));
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.820 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: inifile ReadFloat deutsch/english formatsettings

  Alt 14. Jul 2021, 14:24
gibt's ne Lösung bei der ich nix selber schreiben muss .... eigentlich doch ne Aufgabe der Klasse inifile ......
Das sehen andere zwar auch so (https://quality.embarcadero.com/browse/RSP-17616), aber solange das nicht implementiert ist musst du wohl selber ran.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
392 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: inifile ReadFloat deutsch/english formatsettings

  Alt 14. Jul 2021, 16:30
Doppelpost

Geändert von Rolf Frei (14. Jul 2021 um 16:55 Uhr)
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
392 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: inifile ReadFloat deutsch/english formatsettings

  Alt 14. Jul 2021, 16:53
Eigentlich reicht es doch einfach das DecimalChar zu setzen:
Delphi-Quellcode:
var OrgDecSep: Char;
fIni := TIniFile.Create(aFileName);
  try
    try
      X := fIni.ReadFloat(SectionStr, 'x', -99999); // mag nur Komma-Zahlen mit Deutschen Format 1,2 :-(
    except
      OrgDecSep := FormatSettings.DecimalSeparator;
      try
        FormatSettings.DecimalSeparator := '.';
        X := fIni.ReadFloat(SectionStr, 'x', -99999); // mag nur Komma-Zahlen mit Deutschen Format 1,2 :-(
      finally
        FormatSettings.DecimalSeparator := OrgDecSep;
      end;
    end;
  finally
    fIni.free;
  end;

Oder wenn du genau weisst, dass das INI nach US/ANSI Regel gespeichert wurde, kannst du das auch einmalig vor der Verarbeitung der INI machen:
Delphi-Quellcode:
var OrgDecSep: Char;
OrgDecSep := FormatSettings.DecimalSeparator;
fIni := TIniFile.Create(aFileName);
  try
    FormatSettings.DecimalSeparator := '.';
    X := fIni.ReadFloat(SectionStr, 'x', -99999); // mag nur Komma-Zahlen mit Deutschen Format 1,2 :-(
    ... weitere ReadFLoat, etc.
  finally
    FormatSettings.DecimalSeparator := OrgDecSep;
    fIni.free;
  end;

Geändert von Rolf Frei (14. Jul 2021 um 16:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.820 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: inifile ReadFloat deutsch/english formatsettings

  Alt 14. Jul 2021, 16:54
Eigentlich reicht es doch einfach den DecimalSeparator zu setzen
Wenn sich das ganze nicht in einem Thread abspielt, geht das wohl.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.743 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: inifile ReadFloat deutsch/english formatsettings

  Alt 14. Jul 2021, 17:29
Es ist egal, ob DAS in einem Thread oder im Hauptthread abläuft ... wenn irgendwer Anderes in einem "anderen" Thread gleichzeitig das auch nutzen oder gar ebenfalls ändern will, dann ...
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf