![]() |
inifile ReadFloat deutsch/english formatsettings
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; |
AW: inifile ReadFloat deutsch/english formatsettings
Als String einlesen und mit StrToFloat umwandeln. Dabei die FormatSettings nach Bedarf setzen.
|
AW: inifile ReadFloat deutsch/english formatsettings
gibt's ne Lösung bei der ich nix selber schreiben muss .... eigentlich doch ne Aufgabe der Klasse inifile ......
|
AW: inifile ReadFloat deutsch/english formatsettings
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:
Aber vielleicht wird das Problem ja im nächsten Jahrtausend behoben sein. :stupid: ![]() |
AW: inifile ReadFloat deutsch/english formatsettings
Oder du machst es dir einmal als
Delphi-Quellcode:
und benutzt dann einfach die folgende Unit in deiner
class helper
Delphi-Quellcode:
. Das ist das schwere Los eines Software-Entwicklers, manchmal muss man doch tatsächlich wenigstens noch ein
uses
Delphi-Quellcode:
tippen.
uses
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. |
AW: inifile ReadFloat deutsch/english formatsettings
Zitat:
![]() |
AW: inifile ReadFloat deutsch/english formatsettings
Doppelpost
|
AW: inifile ReadFloat deutsch/english formatsettings
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; |
AW: inifile ReadFloat deutsch/english formatsettings
Zitat:
|
AW: inifile ReadFloat deutsch/english formatsettings
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 ...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:47 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