Bug in TextToFloat oder FloatToStr?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
alexander
Beiträge: 423
Registriert: Di 5. Feb 2008, 12:45
OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
CPU-Target: 64Bit
Kontaktdaten:

Bug in TextToFloat oder FloatToStr?

Beitrag von alexander »

Hi,

also ich frage mich seit längerem wieso ich Probleme mit Floats in Ini Dateien habe und bin zum Schluss gekommen, dass was mit dem DecimalSeperator in den Funktionen TextToFloat oder FloatToStr nicht stimmt. Denn er liest die Zahl 100,53 die ich mit ini.WriteFloat reinschreibe als 10053 heraus (ini.readFloat).

Da beide Proceduren auf den beiden genannten Funktionen beruhen muss es einen darin geben. Sehr wahrscheinlich wird einmal der DecimalSeperator richtig berücksichtigt und einmal nicht.

Hat da jemand eine Idee was es alternativ sein könnte?
Wenn nicht erstelle ich gerade einen Bugreport. EDIT: Ok, hier ist er: http://bugs.freepascal.org/view.php?id=12861" onclick="window.open(this.href);return false;

Gruß Alexander
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Bug in TextToFloat oder FloatToStr?

Beitrag von Euklid »

alexander hat geschrieben:also ich frage mich seit längerem wieso ich Probleme mit Floats in Ini Dateien habe und bin zum Schluss gekommen, dass was mit dem DecimalSeperator in den Funktionen TextToFloat oder FloatToStr nicht stimmt. Denn er liest die Zahl 100,53 die ich mit ini.WriteFloat reinschreibe als 10053 heraus (ini.readFloat).
Hast du

Code: Alles auswählen

DecimalSeparator:=',';
gesetzt? Standardmäßig erkennt er nämlich einen Punkt als Dezimalseparator an.

Gruß, Euklid

PS:
Hat da jemand eine Idee was es alternativ sein könnte?
Wenn nicht erstelle ich gerade einen Bugreport. EDIT: Ok, hier ist er: http://bugs.freepascal.org/view.php?id=12861" onclick="window.open(this.href);return false;
Wie soll jemand hier derart schnell auf deine Frage reagieren können?

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Bug in TextToFloat oder FloatToStr?

Beitrag von Christian »

gesetzt? Standardmäßig erkennt er nämlich einen Punkt als Dezimalseparator an.
Das sollte automatisch nach den Systemlocales passieren.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Bug in TextToFloat oder FloatToStr?

Beitrag von Hitman »

Christian hat geschrieben:
gesetzt? Standardmäßig erkennt er nämlich einen Punkt als Dezimalseparator an.
Das sollte automatisch nach den Systemlocales passieren.
... was allerdings bei Dateiarbeit denkbar ungünstig ist. Einer speichert auf einem System, wo die Localesettings "," vorgeben und ein anderer will sie laden, hat aber "." eingestellt --> crash.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6855
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Bug in TextToFloat oder FloatToStr?

Beitrag von af0815 »

Hitman hat geschrieben:... was allerdings bei Dateiarbeit denkbar ungünstig ist. Einer speichert auf einem System, wo die Localesettings "," vorgeben und ein anderer will sie laden, hat aber "." eingestellt --> crash.
Genau deswegen kann man ja es ändern. Und diesen speziellen Sachen muß man als Programmierer ins Auge sehen und ganz einfach darauf reagieren.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

alexander
Beiträge: 423
Registriert: Di 5. Feb 2008, 12:45
OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
CPU-Target: 64Bit
Kontaktdaten:

Re: Bug in TextToFloat oder FloatToStr?

Beitrag von alexander »

hmmm daran habe ich noch nicht gedacht ihn manuell zu ändern wenn ich in die ini schreibe und dann wieder zurücksetzte...
gute Idee mache ich.

jetzt klappt alles einwandtfrei (unter linux)

unter windows klappt das temporäre setzten von DecimalSeperator:='.' anscheinend nicht...
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Bug in TextToFloat oder FloatToStr?

Beitrag von Euklid »

alexander hat geschrieben:unter windows klappt das temporäre setzten von DecimalSeperator:='.' anscheinend nicht...
In deinem Fall musst du ja auch DecimalSeparator:=',' setzen. Schließlich ist die Zahl in dieser Art auch abgespeichert.

Wenn es nun klappt, dann ist das meiner Meinung nach aber kein so schlimmer Bug mehr.
Der FPC würde sich sicherlich dann korrekt verhalten, wenn es zu einer Exception kommen würde, wenn der Separator nicht passt, oder? Dann müsste der Bugreport entsprechend angepasst werden...

Viele Grüße, Euklid

alexander
Beiträge: 423
Registriert: Di 5. Feb 2008, 12:45
OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
CPU-Target: 64Bit
Kontaktdaten:

Re: Bug in TextToFloat oder FloatToStr?

Beitrag von alexander »

Euklid hat geschrieben:
alexander hat geschrieben:unter windows klappt das temporäre setzten von DecimalSeperator:='.' anscheinend nicht...
In deinem Fall musst du ja auch DecimalSeparator:=',' setzen. Schließlich ist die Zahl in dieser Art auch abgespeichert.
Aber ich will ja die Ini im englischen ZahlenFormat d.h. 0.686 abspeichern. Und dies auch wieder auslesen.
D.h. ich setzte beim schreiben und lesen in und aus der INI den DecimalSeperator:='.' . In Linux klappt auch alles super. Nur in XP scheint er die zahlen falsch zu lesen...


hmmm und ich würde es ja gerne auf minor setzten aber ich finde keinen Edit button....
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu

alexander
Beiträge: 423
Registriert: Di 5. Feb 2008, 12:45
OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
CPU-Target: 64Bit
Kontaktdaten:

Re: Bug in TextToFloat oder FloatToStr?

Beitrag von alexander »

ahhh ok ich muss nascheinend (naatürlich) auch den ThousandSeperator setzten damit es klappt. Wieso es in Linux ohne das setzten klappt und man es in XP braucht kapiere ich nicht.
Danke für eure Hilfe
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Bug in TextToFloat oder FloatToStr?

Beitrag von Euklid »

Wie gesagt: Wenn du den Bugreport noch anpasst, haben die FPC-Entwickler weniger Arbeit. Einen nicht vorhandenen Bug zu finden ist immer schwer.

marcov
Beiträge: 1102
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Bug in TextToFloat oder FloatToStr?

Beitrag von marcov »

Auf linux soll mann unit "clocale" importieren um den RTL zu zwingen system locale data in sysutils zu laden. (2.2.2+)

Funktioniert genau so wie cthreads, und hat auch dieselbe Gründe.

alexander
Beiträge: 423
Registriert: Di 5. Feb 2008, 12:45
OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
CPU-Target: 64Bit
Kontaktdaten:

Re: Bug in TextToFloat oder FloatToStr?

Beitrag von alexander »

ok. Danke marcov. habe ich gemacht. Was bewirkt das genau?

Also nochmal zusammengefasst:
Damit in die ini IMMER in englischer Schreibweise geschrieben wird (damit sie sprachenunabhänig ist), setzte ich den DecimalSeperator und den ThousandSeperator temoprär:
Bevor readfloat oder writefloat mache ich folgende Befehle:

Code: Alles auswählen

tempDecimalSeperator:=DecimalSeparator;
            tempThousandSeparator:=ThousandSeparator;
            DecimalSeparator:='.';  // scheint man in linux nicht zu brauchen schaden aber nicht
            ThousandSeparator:=',';  // scheint man in linux nicht zu brauchen
und nach dem readfloat oder writefloat:

Code: Alles auswählen

DecimalSeparator := tempDecimalSeperator;
              ThousandSeparator := tempThousandSeparator;
Hat jemand eine Elegantere Lösung?
Euklid hat geschrieben:Wie gesagt: Wenn du den Bugreport noch anpasst, haben die FPC-Entwickler weniger Arbeit. Einen nicht vorhandenen Bug zu finden ist immer schwer.
hmmmm habe doch gesagt, dass ich keinen Edit Button finden kann. Kannst du etwa deine Bugs editieren?
Und "nicht vorhanden" verstehe ich bei deiner Aussage einfach nicht... EDIT: ahhh ok, aber müsste nicht korrekterweise, wenn man den DecimalSeperator nicht englisch setzt, sowohl deutsch geschrieben als auch gelesen werden? Wäre das nicht das korrekte Verhalten?
Aber wie es zurzeit ist, nämlich deutsch schreiben, und englisch lesen ist nicht sehr schön und führt wenn man es nicht weiß zu sehr seltsamen Fehlern, weil die Zahlen sich verändern...
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu

marcov
Beiträge: 1102
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Bug in TextToFloat oder FloatToStr?

Beitrag von marcov »

alexander hat geschrieben: Hat jemand eine Elegantere Lösung?
Ja. Definiere ein neues "TFormatSettings" record, und nuetze die D7+ functionen wo man das TFormatsettings record mitgeben kann:

Code: Alles auswählen

var EnglishFormat: TFormatSettings;
 
begin
  EnglishFormat:= DefaultFormatSettings;  // kann nur unter FPC, nicht unter Delphi.
  EnglishFormat.decimalseparator:='.'; // usw fuer andere settings.
  // nuetzen zb:
   if trystrtofloat(s,value,Englishformat) then  // funktioniert auch fuer andere funktionen. ist aber 2.2.0+ und D7+, aber dass sollte nicht problematisch sein.
     begin
         // conversion ok ohne exceptions.
    end;
end;

alexander
Beiträge: 423
Registriert: Di 5. Feb 2008, 12:45
OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
CPU-Target: 64Bit
Kontaktdaten:

Re: Bug in TextToFloat oder FloatToStr?

Beitrag von alexander »

probiere ich aus. danke
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu

Antworten