Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi (N)umerisches Feld akzeptiert keinen Punkt (https://www.delphipraxis.net/70023-n-umerisches-feld-akzeptiert-keinen-punkt.html)

LOMBI 23. Mai 2006 17:23

Datenbank: Paradox • Version: 7 • Zugriff über: Query, DataSource

(N)umerisches Feld akzeptiert keinen Punkt
 
Guten Abend,

sobald ich in ein Edit vom Typ (n)umerisch einen Betrag mit Punkt schreibe,
erhalte ich die Fehlermeldung "kein gültiger Fließkommawert". Was muß ich
bitte tun, damit statt eines ',' ein '.' akzeptiert wird?

Vielen Dank!

Lombi

mkinzler 23. Mai 2006 17:53

Re: (N)umerisches Feld akzeptiert keinen Punkt
 
Delphi-Quellcode:
DecimalSeparator _= '.';

WePo 23. Mai 2006 21:40

Re: (N)umerisches Feld akzeptiert keinen Punkt
 
und wieder umstellen nicht vergessen?

marabu 24. Mai 2006 06:28

Re: (N)umerisches Feld akzeptiert keinen Punkt
 
Guten Morgen.

Wir sollten immer daran denken, dass die von der Unit SysUtils importierten Systemeinstellungen (DecimalSeparator, ThousandsSeparator) das Format der interaktiven Eingaben (TEdit) diktieren. Ist nicht schön, wenn eine Anwendung von vielen, die eventuell sogar gleichzeitig geöffnet sind, sich nicht an die Systemvorgaben hält.

Ein Sonderfall ist die nicht interaktive Übernahme von Display-Daten z.B. aus Dateien. Hier würde ich (D3) die Zeichenketten vorbehandeln und dann der normalen Verarbeitung zuführen:

Delphi-Quellcode:
function Translate(const s, sOld, sNew: String): String;
var
  i, iPos, iLen: integer;
begin
  SetLength(Result, Length(s));
  iLen := 0;
  for i := 1 to Length(s) do
  begin
    iPos := Pos(s[i], sOld);
    if iPos > Length(sNew) then
      Continue;
    Inc(iLen);
    if iPos > 0
      then Result[iLen] := sNew[iPos]
      else Result[iLen] := s[i];
  end;
  SetLength(Result, iLen);
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
var
  e: Extended;
begin
  e := StrToFloat(Translate('123,456.78', '.,', ',.'));
end;
In D7 ist das nicht nötig. Dort stehen GetLocaleFormatSettings() und die überladenen Konvertierungsfunktionen zur Verfügung.

Grüße vom marabu

Edit: Fehler in Translate() korrigiert...

LOMBI 24. Mai 2006 10:08

Re: (N)umerisches Feld akzeptiert keinen Punkt
 
Delphi-Quellcode:
procedure TDemoForm.ButtonClick(Sender: TObject);
var
  e: Extended;
begin
  e := StrToFloat(Translate('123,456.78', '.,', ',.'));
end;
Fehlermeldung: ''123,456.78 ist kein gültiger Fließkommawert'.
Diese Meldung erhalte ich auch mit ','.

Viele Grüße
Lombi

marabu 24. Mai 2006 10:22

Re: (N)umerisches Feld akzeptiert keinen Punkt
 
Klar - weil die Tausenderpunkte bei der Konvertierung nicht mehr drin sein dürfen. Probier mal so:

Delphi-Quellcode:
procedure TDemoForm.ButtonClick(Sender: TObject);
var
  e: Extended;
begin
  e := StrToFloat(Translate('123,456.78', '.,', DecimalSeparator));
end;
marabu

LOMBI 24. Mai 2006 11:01

Re: (N)umerisches Feld akzeptiert keinen Punkt
 
Ne, klappt leider nicht.

Ratte 24. Mai 2006 11:26

Re: (N)umerisches Feld akzeptiert keinen Punkt
 
dann entfern doch die Tausenderpunkte mit Pos() und delete() vorher.
mfg,
Ratte

marabu 24. Mai 2006 12:07

Re: (N)umerisches Feld akzeptiert keinen Punkt
 
Hallo Lombi,

da war ein Fehler in meiner Funktion. Ich habe ihn korrigiert und du müsstest dir den Code nochmal kopieren.

Sorry

marabu

LOMBI 25. Mai 2006 17:16

Re: (N)umerisches Feld akzeptiert keinen Punkt
 
Hi marabu,

danke für die Nachricht. Es gibt nur noch ein Problem und zwar mit der
Berechnung der MwSt. Bei einer Dezimalzahl mit Punkt bleibt das Edit VKbrutto leer.

Viele Grüße
Lombi

marabu 25. Mai 2006 17:31

Re: (N)umerisches Feld akzeptiert keinen Punkt
 
Jetzt wäre es gut die relevanten Zeilen zu sehen, mit denen du die Berechnung versuchst. Zumindest an der Translate-Funktion kann es nicht liegen - vorausgesetzt, der DecimalSeparator ist korrekt gesetzt und nicht von dir verstellt worden. So habe ich getestet:

Delphi-Quellcode:
procedure TDemoForm.ButtonClick(Sender: TObject);
begin
  ShowMessage(
    FloatToStr(
      StrToFloat(
        Translate('123,456.78', '.,', DecimalSeparator)
      )
    )
  );
end;
Grüße vom marabu

LOMBI 26. Mai 2006 17:29

Re: (N)umerisches Feld akzeptiert keinen Punkt
 
Hallo marabu,

würdest Du bitte prüfen, was ich falsch mache:

Delphi-Quellcode:
implementation
...
function Translate(const s, sOld, sNew: String): String;
var
  i, iPos, iLen: integer;
begin
  SetLength(Result, Length(s));
  Result := s;
  iLen := 0;
  for i := 1 to Length(s) do
  begin
    iPos := Pos(s[i], sOld);
    if iPos > Length(sNew) then
      Continue;
    Inc(iLen);
    if iPos > 0 
      then Result [iLen] := sNew[iPos]
      else Result[iLen] := s[i];
    end;
    SetLength(Result, iLen);
  end;

procedure TDemoForm.EditEKpreisExit(Sender: TObject);
// keine DBGridAnzeige, Code funktioniert auch ohne var e: Extended
var
  e: Extended;
begin
  e := StrToFloat(Translate('123,456.78', '.,', DecimalSeparator));
end;

oder

procedure TDemoForm.EditEKpreisExit(Sender: TObject);
// DBGridanzeige, nur mit ',' sonst Fehlermeldung
begin
  QueryArtikel.FieldByName('EKpreis').AsFloat :=
  StrToFloat(EditEKpreis.Text);
end;
Hab's ohne Erfolg auch mit Deiner Tax-Demo ausprobiert.
Was bedeutet: '123,456.78'?

Grüße
Lombi

marabu 26. Mai 2006 18:15

Re: (N)umerisches Feld akzeptiert keinen Punkt
 
Hallo Lombi,

wenn ich deine Zeilen richtig interpretiere, dann möchtest du in deinem Control EditEKpreis eine Zahl mit Nachkommastellen im amerikanischen Display-Format (DecimalPoint ist Punkt, ThousandSeparator ist Komma) eingeben dürfen und diese Zahl soll beim Verlassen des Edit-Controls im passenden Datenfeld einer updatefähigen Query gespeichert werden, die du vorher in den korrekten Zustand (Edit oder Insert) versetzt hast. Hier die nötigen Änderungen:

Delphi-Quellcode:
procedure TDemoForm.EditEKpreisExit(Sender: TObject);
var
  value: Extended;
begin
  value := StrToFloat(Translate(EditEKpreis.Text, '.,', DecimalPoint));
  with QueryArtikel do
    FieldByName('EKpreis').AsFloat := value;
end;
Die Funktion Translate nimmt den Text aus dem Eingabe-Control entgegen und setzt jedes Vorkommen eines Zeichens aus dem zweiten Parameter in das korrespondierende Zeichen aus dem dritten Parameter um. Es wird also '.' in SysUtils.DecimalPoint umgesetzt. Für das Komma im zweiten Parameter gibt es kein entsprechendes Zeichen im dritten Parameter. Solche Zeichen werden dann einfach entfernt. Unix-Kenner sollten dieses Verhalten vom utility tr her kennen.

Zitat:

Was bedeutet: '123,456.78'?
Ein fiktiver Geldbetrag im amerikanischen Display-Format.

Grüße vom marabu

LOMBI 27. Mai 2006 16:50

Re: (N)umerisches Feld akzeptiert keinen Punkt
 
Hallo marabu,

Delphi-Quellcode:
...
value := StrToFloat(Translate(EditEKpreis.Text, '.,', DecimalPoint));
...
'DecimalPoint' existiert leider unter D3 nicht, deshalb:

Delphi-Quellcode:
...
value := StrToFloat(Translate(EditEKpreis.Text, '.,', DecimalSeparator));
...
Zusätzlich habe ich in der Systemsteuerung die Ländereinstellung für
Zahlen verändert und den folgenden Code ergänzt:

Delphi-Quellcode:
procedure TDemoForm.EditEKpreisKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = ',' then Key := '.';
end;
Problem ist noch, wenn EditEKpreis, EditVknetto oder EditVKbrutto leer
ohne Eintrag bleiben, dann kommt die Meldung: '' kein gültiger
Fließkommawert.

Wie kann ich denn bei den Edits noch die Stellen vor und nach dem Komma festlegen, z.B. 6 Stellen vor und 4 nach dem ,

Herzlichen Dank nochmals für Deine Mühe!

Grüße
Lombi

marabu 27. Mai 2006 18:29

Re: (N)umerisches Feld akzeptiert keinen Punkt
 
Hallo Lombi,

gut, dass du nicht über meinen Schreibfehler gestolpert bist - nachdem ich die Variable vorher so oft richtig geschrieben hatte.

Zitat:

Zitat von LOMBI
Zusätzlich habe ich in der Systemsteuerung die Ländereinstellung für Zahlen verändert

Warum das? Und hast du die Einstellung programm- oder systemweit verändert?

Delphi-Quellcode:
procedure TDemoForm.EditEKpreisKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = ',' then Key := '.';
end;
Damit möchtest du wohl das Komma im Ziffernblock für die Eingabe des "Dezimal-Punkt" nutzbar machen. Willst du denn Kommazahlen im amerikanischen Format eingeben?

Zitat:

Zitat von LOMBI
Problem ist noch, wenn EditEKpreis, EditVknetto oder EditVKbrutto leer ohne Eintrag bleiben, dann kommt die Meldung: '' kein gültiger Fließkommawert.

Vermutlich hast du versucht den leeren String mit StrToFloat() zu konvertieren. Du solltest eine Abfrage einbauen.

Zitat:

Zitat von LOMBI
Wie kann ich denn bei den Edits noch die Stellen vor und nach dem Komma festlegen, z.B. 6 Stellen vor und 4 nach dem ,

Macht ja nur für die Ausgabe Sinn - so geht es: Format('%10.4f', [e])

Freundliche Grüße

marabu

LOMBI 28. Mai 2006 11:14

Re: (N)umerisches Feld akzeptiert keinen Punkt
 
Guten Tag marabu,

gestern habe ich den ganzen Nachmittag damit verbracht,
am Code rumzubasteln. Ich kann in EditEKpreis und EditVKnetto
Beträge mit '.' eingeben, aber es wird keine MwSt in
EditVKbrutto errechnet (nur mit ',' aus der Systemeinstellung)
und weil dieses Feld leer bleibt, kommt es zur
Fehlermeldung.

Auf der Form Artikel habe ich die relevanten Felder EditEKpreis, EditVKnetto und EditVKbrutto. Während der Laufzeit sollen die
Preise eingetragen werden, bis zu 6 Stellen vor und 4 Stellen nach
dem Dezimalzeichen generell als '.', nicht ','.

123456.0000
100.0000

Wird in EditVKnetto z.B. 100. eingetragen, dann sollen
die 0000 automatisch ergänzt werden und der Bruttobetrag
in EditVKbrutto mit 116.000 stehen. Es kann auch vorkommen,
dass die Fehler einmal leer gespeichert werden müssen.

Kannst Du mir bitte helfen?

Viele Grüße
Lombi

LOMBI 28. Mai 2006 18:08

Re: (N)umerisches Feld akzeptiert keinen Punkt
 
Könntest Du mir bitte noch mitteilen, ob sich der Dezimalpunkt im OnCreate der Form unveränderlich in EditEKpreis usw. platzieren ließe?
(xxxxxx.xxxx)

Gruß
Lombi

marabu 28. Mai 2006 18:12

Re: (N)umerisches Feld akzeptiert keinen Punkt
 
Lombi, ich arbeite gerade die Tax-Demo um.

Bis später

marabu

marabu 28. Mai 2006 19:24

Re: (N)umerisches Feld akzeptiert keinen Punkt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Lombi,

ich weiß nicht ob du eine konkrete Anwendung im Sinn hast oder ob das alles nur Übungen sind. Wenn du die Bedienung deines GUI-Programms auf englische Eingaben umstellen möchtest, dann schau dir die Demo im Anhang an. Sie zeigt dir, wie du Benutzereinstellungen auf Programmebene vornehmen kannst und dich dabei vor einer ungewollten Aktualisierung der Einstellungen schützt.

Nur wenn du englische und deutsche Formate nebeneinander verarbeiten willst nimmst du Translate() und ähnliche Routinen, weil du dich für ein einziges locale setting entscheiden wirst und nicht für jede Konvertierung vom und ins Displayformat die Ländereinstellungen umschalten willst.

Ich hoffe du kannst die Demo übersetzen - unter D7 funktioniert alles wie es soll, D3 habe ich leider nicht installiert.

Freundliche Grüße

marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz