Decimalseparator Problem

Für Fragen von Einsteigern und Programmieranfängern...

Decimalseparator Problem

Beitragvon DL3AD » 5. Nov 2017, 16:15 Decimalseparator Problem

Hallo,

hier mal ein Programmschnipsel
Code: Alles auswählen
 
var
  Form1: TForm1;
  DefaultFormatSettings: TFormatSettings;
 
implementation
{$R *.lfm}
{ TForm1 }
//Initialisierungen
procedure TForm1.FormCreate(Sender: TObject);
begin
//  DecimalSeparator:='.';
  DefaultFormatSettings.DecimalSeparator:= '.';
end;
 
//Test
procedure TForm1.Button1Click(Sender: TObject);
var
  L_wert: UnicodeString;
  Lwert: Extended;
begin
  L_wert:= '1.0';//Eingangswerte mit einer Kommastelle
  Lwert:= StrTofloat(L_wert);//Umwandel in Float zur Berechnung
end;       
 


Ich habe nun versucht den veralteten DecimalSeparator:='.' durch das aktuelle DefaultFormatSettings.DecimalSeparator:= '.' zu ersetzen.
Mit dem alten DecimalSeparator:='.' funktioniert meine Anwendung sowohl unter Windows und auch Linux.
Mit dem neuen DefaultFormatSettings.DecimalSeparator:= '.' gibt es einen Fehler EConvertError unter Windows - Linux funktioniert.

Was mache ich da falsch ?

Gruß Frank
DL3AD
 
Beiträge: 300
Registriert: 13. Sep 2013, 11:07
Wohnort: Rügen
OS, Lazarus, FPC: Win7 (L 1.6.4 FPC 3.0.2) und Debian 8 (L 1.6.4 FPC 3.0.2) | 
CPU-Target: 32Bit
Nach oben

Beitragvon theo » 5. Nov 2017, 16:47 Re: Decimalseparator Problem

Du brauchst das nicht in deinem Code deklarieren, das ist schon eine globale Variable.

Streiche
Code: Alles auswählen
var
..
  DefaultFormatSettings: TFormatSettings;
theo
 
Beiträge: 7879
Registriert: 11. Sep 2006, 18:01

Beitragvon Mathias » 5. Nov 2017, 16:56 Re: Decimalseparator Problem

Versuche es mal so:
Code: Alles auswählen
  Lwert:= StrTofloat(L_wert, DefaultFormatSettings); //Umwandel in Float zur Berechnung


Wobei ich einen anderen Namen als DefaultFormatSettings nehmen würde, da dies in der LCL schon vorhanden ist. :wink:

Dann funktioniert sogar so was. :mrgreen:
Code: Alles auswählen
var
  myFormatSettings: TFormatSettings;
begin
  myFormatSettings.DecimalSeparator := 'x';
  Lwert := StrToFloat('123x456', myFormatSettings);
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3189
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon DL3AD » 5. Nov 2017, 18:27 Re: Decimalseparator Problem

...hmm so muss ich ja bei jeder Umformatierung Änderungen vornehmen. :shock:
Mit dem alten DecimalSeparator:='.' funktionierte es dann global für das gesammte Projekt.
Gibt en nach der neuen Methode auch eine globale Einstellung ?
DL3AD
 
Beiträge: 300
Registriert: 13. Sep 2013, 11:07
Wohnort: Rügen
OS, Lazarus, FPC: Win7 (L 1.6.4 FPC 3.0.2) und Debian 8 (L 1.6.4 FPC 3.0.2) | 
CPU-Target: 32Bit
Nach oben

Beitragvon Mathias » 5. Nov 2017, 18:32 Re: Decimalseparator Problem

So wie es theo macht, sollte es global gehen.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3189
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon DL3AD » 5. Nov 2017, 19:54 Re: Decimalseparator Problem

...hmm, ich möchte dass der '.' sowohl unter Windows und Linux als Dezimalseperator gilt - und zwar unabhänig von den Betriebssystemeinstellungen ist.
Also muss ich etwas angeben.
Was genau muss ich denn nun angeben ?
DL3AD
 
Beiträge: 300
Registriert: 13. Sep 2013, 11:07
Wohnort: Rügen
OS, Lazarus, FPC: Win7 (L 1.6.4 FPC 3.0.2) und Debian 8 (L 1.6.4 FPC 3.0.2) | 
CPU-Target: 32Bit
Nach oben

Beitragvon Mathias » 5. Nov 2017, 19:59 Re: Decimalseparator Problem

Wen du ein Punkt willst, dann nimm doch die Funktionen Str und Val, diese Funktionen sind unabhängig vom OS/Lazarus. So nebenbei sind diese sehr schnell.
StrToFloat und FloatToStr verwenden schlussendlich auch diese beiden Funktionen.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3189
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon DL3AD » 5. Nov 2017, 20:06 Re: Decimalseparator Problem

OK - kannst du mal ein Beispiel geben damit ich verstehe was genau du meinst.
DL3AD
 
Beiträge: 300
Registriert: 13. Sep 2013, 11:07
Wohnort: Rügen
OS, Lazarus, FPC: Win7 (L 1.6.4 FPC 3.0.2) und Debian 8 (L 1.6.4 FPC 3.0.2) | 
CPU-Target: 32Bit
Nach oben

Beitragvon Mathias » 5. Nov 2017, 20:28 Re: Decimalseparator Problem

So nebenbei kann du noch sehr einfach Formatieren.
Und eine Fehlerauswertung ist auch noch dabei. :wink:
Code: Alles auswählen
var
  f: single;
  s: string;
  e: integer;
 
begin
  f := 123.456;
  Str(f, s);
  WriteLn(s);
  Str(f: 10: 4, s);
  WriteLn(s);
 
  s := '654.321';
  Val(s, f, e);
  if e <> 0 then begin
    WriteLn('Fehler');
  end else begin
    WriteLn(f);
    WriteLn(f: 10: 4);
  end;
end.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3189
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon DL3AD » 5. Nov 2017, 21:04 Re: Decimalseparator Problem

DANKE!
nun ist alles klar 8) - baue meinen Code um.

Selten so ein gutes Forum mit so hilfreichen Usern gefunden wie dieses.
DL3AD
 
Beiträge: 300
Registriert: 13. Sep 2013, 11:07
Wohnort: Rügen
OS, Lazarus, FPC: Win7 (L 1.6.4 FPC 3.0.2) und Debian 8 (L 1.6.4 FPC 3.0.2) | 
CPU-Target: 32Bit
Nach oben

Beitragvon wp_xyz » 5. Nov 2017, 22:13 Re: Decimalseparator Problem

Hast du theo's Vorschlag nicht verstanden? Das ist doch viel einfacher!

Hier nochmal dein Code aus dem 1.Beitag (deine eigenen Kommentare habe ich entfernt). Entferne einfach deine eigene Deklaration von DefaultFormatSettings, dann funktioniert alles ohne weitere Änderung. Denn DefaultFormatSettings in der Original-Deklaration in SysUtils wird für die String-Zahl-Konvertierung verwendet. Durch deine eigene Deklaration unter demselben Namen wird die richtige nicht mehr verwendet.

Code: Alles auswählen
var
  Form1: TForm1;
 // DefaultFormatSettings: TFormatSettings;  <--- das muss weg, denn des ist bereits in SysUtils deklariert
 
implementation
{$R *.lfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
  DefaultFormatSettings.DecimalSeparator:= '.';   // <--- Nun bezieht sich das auf die DefaultSettings in SysUtils, die in den Konvertierungsfunktionen verwendet werden
end;
 
//Test
procedure TForm1.Button1Click(Sender: TObject);
var
  L_wert: UnicodeString;               // <--- und warum hier UnicodeString und nicht String?
  Lwert: Extended;
begin
  L_wert:= '1.0';
  Lwert:= StrTofloat(L_wert);
end;

Aber mein üblicher Vorbehalt in diesem Zusammenhang: Es ist bei uns nun mal üblich, Dezimalzahlen mit Komma zu schreiben, nicht mit Punkt. Eigens dafür gibt es die entsprechenden Betriebssystemeinstellungen. Wenn du das umgehst, wird dein Programm für jeden Nicht-Programmierer unnötig schwer benutzbar. Denn er erhält bei jeder Eingabe des für ihn gewohnten Kommas eine Fehlermedlung. Solche Software überlebt auf meinem Rechnen nur den 1. Start. Wenn du unbedingt Zahlen mit Punkt eingeben willst, dann ändere es im Betriebssystem deines Rechners, dann verhalten sich auch alle anderen Programme so. Und wenn deine Kunden lieber das Komma wollen, dann funktioniert alles wie gewohnt.
Zuletzt geändert von wp_xyz am 6. Nov 2017, 11:03, insgesamt 1-mal geändert.
wp_xyz
 
Beiträge: 2249
Registriert: 8. Apr 2011, 08:01

Beitragvon Mathias » 5. Nov 2017, 22:27 Re: Decimalseparator Problem

Es ist bei uns nun mal üblich, Dezimalzahlen mit Komma zu schreiben, nicht mit Punkt.

Das betrifft fast nur den Office-Bereich.
Aber nur im EU Raum, in der CH und USA wird ein Punkt verwendet, welches auch in der Muttersprache des PCs ist. Ansonsten würde Val und Str keinen Punkt verlangen.

Oder wen man zB. OBJ-Wavefront Dateien bearbeiten will, ist man auf den Punkt angewiesen.
Oder fast alle Programmiersprachen verwenden einen Punkt.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3189
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon DL3AD » 6. Nov 2017, 08:54 Re: Decimalseparator Problem

Hallo wp_xyz,

nun ist es mir klar geworden - Mein Denkfehler war dass ich DefaultFormatSettings: TFormatSettings definiren muss - aber es ist ja schon eine globale Variable - dass wuste ich nicht.
Danke für deine wie immer gute verdeutlichung des Sachverhaltes.

Gruß
Frank
DL3AD
 
Beiträge: 300
Registriert: 13. Sep 2013, 11:07
Wohnort: Rügen
OS, Lazarus, FPC: Win7 (L 1.6.4 FPC 3.0.2) und Debian 8 (L 1.6.4 FPC 3.0.2) | 
CPU-Target: 32Bit
Nach oben

Beitragvon theo » 6. Nov 2017, 10:25 Re: Decimalseparator Problem

@Mathias; Lass doch eine richtige Antwort einfach mal unkommentiert, bis sich der Fragende wieder meldet.
Wenn die Antwort nicht klar ist, kannst du dich immer noch einbringen.
So verwirrst du mehr als du hilfst.

Danke.
theo
 
Beiträge: 7879
Registriert: 11. Sep 2006, 18:01

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried