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 1 von 2  1 2      
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#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
Online

Registriert seit: 16. Jun 2011
721 Beiträge
 
Delphi 12 Athens
 
#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.138 Beiträge
 
Delphi 11 Alexandria
 
#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
44.314 Beiträge
 
Delphi 12 Athens
 
#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
Ein Therapeut entspricht 1024 Gigapeut.

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
6.190 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
freimatz

Registriert seit: 20. Mai 2010
1.490 Beiträge
 
Delphi 11 Alexandria
 
#6

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
655 Beiträge
 
Delphi 11 Alexandria
 
#7

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.106 Beiträge
 
Delphi 2009 Professional
 
#8

AW: inifile ReadFloat deutsch/english formatsettings

  Alt 16. Jul 2021, 08:49
Wenn es um Datum geht würde ich das in ANSI-Format speichern. Aber Fragenden ging es wohl um "normale" Double.
Es gibt keinen Unterschied zwischen TDateTime und Double. Es sind einfach zwei Begriffe für exakt dasselbe, nämlich IEEE-754-Double. Nur die Darstellung von generischen Double-Werten als Datum ist nicht so toll, da u.U. ungültig (max 9999?).

Pointer sind bei uns - zum Glück - zu Recht - verboten.
Und mit Windows kommuniziert ihr in Morsecode?
Es gibt halt keinen verlustfreien Weg, eigentlich inkompatiblen Speicher zu casten.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.599 Beiträge
 
Delphi 12 Athens
 
#9

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
655 Beiträge
 
Delphi 11 Alexandria
 
#10

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
Antwort Antwort
Seite 1 von 2  1 2      


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 08:31 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 by Thomas Breitkreuz