DefaultFormatSettings.DecimalSeparator

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: DefaultFormatSettings.DecimalSeparator

Beitrag von Mathias »

https://de.wikipedia.org/wiki/Dezimaltrennzeichen
Die Schulen des Kantons St. Gallen[3] wie auch des Kantons Zürich lehren beispielsweise den Dezimalpunkt. Es kommt vor, dass in der Unterstufe/Primarschule das Komma (wie es gesprochen wird), ab der Mittelstufe der Punkt gelehrt wird.

Da kann aber etwas nicht stimmen, ich wohne im Kanton Zürich und in der Schule, auch Beruf-Schule, wurde immer ein Komma gesprochen.
Auch am Arbeitsplatz, sagen wir zB. 5komma2 Meter. Auf dem Papier wird schon wie gesagt ein ',' geschrieben, aber auf dem PC ein '.'

@MmVisual: Aber du musst sicherstellen, dass die Zahl keinen Tausendertrenner enthält. Woher weißt du, dass dein User bei einer Eingabe von "1.000" die Zahl 1000 mit deutschem Tausendertrennzeichen oder 1,000 mit deutschem Dezimalkomma meint?

Zuerst dachte ich, das die Function von MmVisual brauchbar ist, aber ich wusste doch, das es wieder einen Haken gibt.
Ein Zahl wie 1.000 ist für mich immer eine Eins und keine Tausend.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: DefaultFormatSettings.DecimalSeparator

Beitrag von MmVisual »

Meine Funktion ist brauchbar, weil es niemand gibt der absichtlich Tausender-Trennzeichen eingibt.
Daher ist für jeden normalsterblichen eine 1.000 oder 1,000 immer 1 Komma 000


Außerdem kann man schon während der Eingabe die korrekte Eingabe überwachen:

Code: Alles auswählen

procedure TfrmMain.edFloatKeyPress(Sender: TObject; var Key: char);
Var s: String;
begin
  if (Key = '.') or (Key = ',') then
    Key := DefaultFormatSettings.DecimalSeparator;
  if not (Key in [#1..#31, DefaultFormatSettings.DecimalSeparator, '0'..'9', '-']) then
    Key := #0;
  s := TEdit(Sender).Text;
  If TEdit(Sender).SelLength > 0 Then // Löschen wenn ein Teil markiert und somit automatisch überschrieben wird
    Delete(s, TEdit(Sender).SelStart + 1, TEdit(Sender).SelLength);
  if (Key = DefaultFormatSettings.DecimalSeparator) and
    (Pos(DefaultFormatSettings.DecimalSeparator, s) > 0) then
    Key := #0;
  If (Key = '-') And (Pos('-', s) > 0) Then
    Key := #0;
end
EleLa - Elektronik Lagerverwaltung - www.elela.de

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

Re: DefaultFormatSettings.DecimalSeparator

Beitrag von wp_xyz »

MmVisual hat geschrieben:Daher ist für jeden normalsterblichen eine 1.000 oder 1,000 immer 1 Komma 000

Gottseidank, dann ist der frisch inkl Debuginfos kompilierte Lazarus doch nur 170 KB groß und nicht 170 MB - siehe Screenshot vom Windows Explorer.
Dateianhänge
Laz.png
Laz.png (4.31 KiB) 1805 mal betrachtet

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: DefaultFormatSettings.DecimalSeparator

Beitrag von MmVisual »

Für eine Darstellung ist das 1000-Trennzeichen ja OK. Aber wer gibt das ein? - Zumindest ich kenne niemand der schon mal in ein Zahleneingabefeld oder einem Taschenrechner die 1000der Trennzeichen eingegeben hat.
Abgesehen davon gibt es auf einer Zahlentastatur auch keine 1000der Trennzeichen :mrgreen:

Somit muss man schon mal grundlegend unterscheiden zwischen einer Anzeige, die es vereinfacht die Zahl schneller lesen zu können und der Eingabe.
EleLa - Elektronik Lagerverwaltung - www.elela.de

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

Re: DefaultFormatSettings.DecimalSeparator

Beitrag von Mathias »

Gottseidank, dann ist der frisch inkl Debuginfos kompilierte Lazarus doch nur 170 KB groß und nicht 170 MB - siehe Screenshot vom Windows Explorer.

Dein Explorer sieht irgendwie komisch aus, da würde ich auch 170KB lesen. :mrgreen:

Meine Funktion ist brauchbar, weil es niemand gibt der absichtlich Tausender-Trennzeichen eingibt.

Eine Million schreibe ich mit Tausender-Trenner 1'000'000 , auch auf Papier.
Ansonsten muss man bei so viel Nullen sehr genau gucken.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: DefaultFormatSettings.DecimalSeparator

Beitrag von Mathias »

Zumindest ich kenne niemand der schon mal in ein Zahleneingabefeld oder einem Taschenrechner die 1000der Trennzeichen eingegeben hat.

Eingeben nicht, aber vielleicht ein CopyPaste.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: DefaultFormatSettings.DecimalSeparator

Beitrag von MmVisual »

Dann programmiere eine Funktion - wie Du das hin bekommst, dazu habe ich schon genügend Beispiele und Tipps gegeben ... :wink:

Wenn Du allerdings das Programm auch einem Deutschen geben willst, überlege Dir das nochmal genau was der Otto Normalo so braucht.
EleLa - Elektronik Lagerverwaltung - www.elela.de

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

Re: DefaultFormatSettings.DecimalSeparator

Beitrag von Mathias »

So wie es aussieht braucht der Thread-Ersteller gar keine neue Function, so wie ich es verstanden will er nur einen Float in eine Ini-Datei speichern, und dafür gibt es fertige Functionen, welche auch Floats speichern
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: DefaultFormatSettings.DecimalSeparator

Beitrag von corpsman »

ei ei, da habe ich wieder eine Diskussion los getreten...

Ich habe bisher in Meinen Programmen etwas derart wie MVisual das geschrieben hatte.

Code: Alles auswählen

 
procedure TfrmMain.edFloatKeyPress(Sender: TObject; var Key: char);
Var s: String;
begin
  if (Key = ',') then
    Key := '.'
 


Damit hat der Benutzer quasi immer richtig eingegeben. Mein Eindruck war aber auch eher dass sich da niemand dran stört das genau das geschieht, bzw es überhaupt bemerkt hätte das da ein Punkt anstatt eines Komma steht.

Übrigens passiert der Fehler den ich beschrieben hatte auch in einem Consolenprogramm von Mir, das weder XML noch andere LCL komplexe nutzt. Lediglich eine Klasse welche via LNet etliches an Daten durch die Gegend schaufelt und hin und wieder mal ne .ini Datei lädt, hier auch komplett ohne User Interaktion (zumindest via Konsole) über TCP geht da einiges rein und raus *g*.

Nach allem was ihr da so geschrieben habt, müsste ich also zur ein und Ausgabe den DefaultFormatSettings.DecimalSeparator nehmen und beim Schreiben / Laden alles durch eine Variante ersetzen, welche via Parameter Fest auf Punkt setzt, so dass ich Sprachunabhängig wieder laden kann.
=> das wird ne Menge Arbeit ..
--
Just try it

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

Re: DefaultFormatSettings.DecimalSeparator

Beitrag von Mathias »

=> das wird ne Menge Arbeit ..

Oder nimm, wie ich oben schon mal geschrieben habe Str und Val, anstelle von StrToFloat und FloatToStr.
Da wird immer ein Punkt genommen, egal was sonst alles verstellt ist.
Für Eingabe-Masken würde ich dies die Ländereinstellung machen lassen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten