StrToFloat - Komma bei Dezimaltrenner »Punkt«

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
Swirl
Beiträge: 93
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 10/11/ Mint 21.3 / Lazarus 30 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

StrToFloat - Komma bei Dezimaltrenner »Punkt«

Beitrag von Swirl »

Hallo,
habe da mal eine Frage zu StrToFloat.
War immer davon ausgegangen, dass man StrToFloat generell mit einem String mit »Punkt« füttern muss.
Der folgende (auf das Problem heruntergebrochene) Code wirft mir allerdings ein Invalid Float aus.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  sWaeschePreis: String;
  fWaescheEintrag: Single;
begin
  sWaeschePreis := '13.00';
  fWaescheEintrag := StrToFloat(sWaeschePreis);
end;


Wenn ich jetzt ein Komma statt eines Punktes in 13.00 einsetze geht das Ganze. Ich war immer
davon ausgegangen, dass die Funktion IMMER einen Punkt »braucht«, und sich nicht am Dezimal-
trenner des Systems (Win7) orientiert.

Da mein Projekt auch laufen soll, ohne dass ggf. der Dezimaltrenner im System geändert werden
muss, meine Frage, ob man den Dezimaltrenner in Lazarus auslesen kann? Und dann eben den Code
entsprechend anpasst.

Gruß,
Michael
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: StrToFloat - Komma bei Dezimaltrenner »Punkt«

Beitrag von Warf »

Schau dir mal die Variabel DefaultFormatSettings an, da steht so etwas drin. Die Daten werden vom System gelesen, also wenn man einen Französischen oder Deutschen Rechner hat wird , als Dezimalseperator gesetzt, auf amerikanischen und Britischen Rechnern der .

Um immer den Punkt zu verwenden könntest du so etwas verwenden:

Code: Alles auswählen

 
var c: Char;
begin
  c := DefaultFormatSettings.DecimalSeparator;
  DefaultFormatSettings.DecimalSeparator := '.';
  // Convertierungszeugs
  DefaultFormatSettings.DecimalSeparator := c;   

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: StrToFloat - Komma bei Dezimaltrenner »Punkt«

Beitrag von wp_xyz »

Wichtig ist noch zu wissen, dass man die Konvertierungsroutinen StrToFloat, FloatToStr usw auch mit optionalen lokalen FormatSettings füttern kann. Damit kann man die Ländereinstellung zum Beispiel für das Einlesen einer Datei vorübergehend abändern, ohne die globalen Einstellungen (DefaultFormatSettings) anzufassen. Letzteres hätte den Nachteil, dass die ganze Benutzeroberfläche umgestellt wird. Der folgende Code läuft auf einem deutschen Windows mit Komma als Dezimaltrenner, wobei in einem Edit-Feld weiterhin das Komma verwendet werden kann:

Code: Alles auswählen

var
  sWaeschePreis: String;
  fWaescheEintrag: Single;
  fs: TFormatSettings;
begin
  fs := DefaultFormatSettings;
  fs.DecimalSeparator := '.';
  sWaeschePreis := '13.00';
  fWaescheEintrag := StrToFloat(sWaeschePreis, fs);
end;

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: StrToFloat - Komma bei Dezimaltrenner »Punkt«

Beitrag von Mathias »

War immer davon ausgegangen, dass man StrToFloat generell mit einem String mit »Punkt« füttern muss.

Wen es immer ein "." sein muss, dann nehme ich am liebsten die alten Pascal-Funktionen "val" und "str".
So nebenbei geht es mit den am schnellsten, weil StrToFloat und FloatToStr schlussendlich auch diese beiden Funktionen nutzt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Swirl
Beiträge: 93
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 10/11/ Mint 21.3 / Lazarus 30 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

Re: StrToFloat - Komma bei Dezimaltrenner »Punkt«

Beitrag von Swirl »

Mensch, seid Ihr fix...
Besten Dank Euch Dreien - bin dann, angeregt durch die Stichworte,
bei einer Suche noch auf diese Diskussion hier im Forum gestoßen:
viewtopic.php?f=10&t=8699
Schönes WE,
Michael
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2

Antworten