Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit der Procedure : val (https://www.delphipraxis.net/82356-problem-mit-der-procedure-val.html)

Chemiker 11. Dez 2006 20:18


Problem mit der Procedure : val
 
Hallo,

ich habe folgendes Problem mit der Procedure val

Delphi-Quellcode:
st1:= '0000-135.12';
val(st1,Zahl,code);
Dann ist das Ergebnis von der Variable Zahl = 0.00

Wenn die Zahl kein Vorzeichen hat, also

Delphi-Quellcode:
st1:= '00000135.12';
val(st1, Zahl, code);
So ist das Ergebnis von Zahl = 135.12

Kann mir jemand da weiterhelfen, wie ich den String trotz Vorzeichen in die richtige Zahl umwandeln kann.


Bis bald Chemiker

Muetze1 11. Dez 2006 20:36

Re: Problem mit der Procedure : val
 
Zitat:

Zitat von Chemiker
Kann mir jemand da weiterhelfen, wie ich den String trotz Vorzeichen in die richtige Zahl umwandeln kann.

Ein Vorzeichen heisst Vorzeichen, weil das Zeichen vor der Zahl steht. Dein Vorzeichen steht mitten in der Zahl und auch ein Mathematiker würde dir keine führenden Nullen vor einem Vorzeichen akzeptieren. Das Verhalten von Val() ist vollkommen korrekt. Wenn das Vorzeichen wirklich vorne steht, dann würde das auch klappen. Daher benutze die Stringfunktionen um das Vorzeichen entsprechend zu korrigieren.

trojaner 12. Dez 2006 14:12

Re: Problem mit der Procedure : val
 
Hallo
Delphi-Quellcode:
st1:= '0000-135.12';

repeat
  val(st1,Zahl,code);
  delete(st1,code,1);
until code = 0;
versuche es mal so!
Gruss
Trojaner

marabu 12. Dez 2006 14:32

Re: Problem mit der Procedure : val
 
Hallo,

wenn es sich nur um ein deplatziertes Minuszeichen handelt, dann hätte ich auch einen Vorschlag:

Delphi-Quellcode:
function TryVal(s: String; var e: Extended): Boolean;
var
  iPos: Integer;
begin
  iPos := Pos('-' ,s);
  if iPos > 1 then
  begin
    Move(s[1], s[2], Pred(iPos));
    s[1] := '-';
  end;
  Val(s, e, iPos);
  Result := iPos = 0;
end;
Freundliche Grüße

Muetze1 12. Dez 2006 15:12

Re: Problem mit der Procedure : val
 
Marabu: Ich habe Bedenken bei deinem Code: Durch das Move wird der String verschoben, aber ich denke das Ende des Strings wird nicht angepasst so dass am Ende eine Zahlenreihe nochmals erscheint, welche zu falschen Ergebnissen führt. Dies könnte sogar soweit gehen, dass der Dezimalpunkt doppelt vorhanden ist.

Dieser Einwand entsteht jetzt nur durch lesen und überdenken deines Codes - liege ich da richtig?


Falsch - alles richtig. Ich hatte das verschieben falsch herum betrachtet. Marabu macht alles richtig - der Code ist in Ordnung und sollte schneller sein und vor allem sicherer (Gefahr eines Deadlocks bei trojaner?)

Chemiker 15. Dez 2006 23:48

Re: Problem mit der Procedure : val
 
Hallo,

vielen Dank für Eure Tipps.

Die function TryVal() von marabu hat mir sehr weitergeholfen!

Das Problem ist deshalb entstanden, weil dieser String zu einem Datenblock gehört der von einer serielle Schnittstelle übertragen wird und von einem Programm in seine Bestandteile zerlegt wird. Dabei benutze ich für den Mess-Wert der übertragen wird eine Maske aus 11 Nullen, damit der Dateblock immer die gleiche Länge hat.


Dabei habe ich schlichtweg übersehen, dass es auch negative Temperaturen gibt.

Bis bald Chemiker


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:55 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