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 FloatToStr (https://www.delphipraxis.net/59237-problem-mit-floattostr.html)

inherited 19. Dez 2005 20:26


Problem Mit FloatToStr
 
Hi,
auch ich bin neu hier im Forum angemeldet(hab vorher öfter schon vorbeigeschaut)
doch jetzt hab ich ein Problem und keinen Plan woran es liegen könnte
Ich benutze Delphi 3 (tja leider kein geld für was besseres) und irgendwie mag Delphi folgende Zeilen nicht

Delphi-Quellcode:
erg2:=FloatToStr(erg5);
wobei erg2 ein String und erg5 ein real ist.
Er sagt dann immer "Operator ist auf diesen Operandentyp nicht anwendbar"
Was soll ich tun
Bitte helft mir *verzweifeltguck*

engine 19. Dez 2005 20:43

Re: Problem Mit FloatToStr
 
Hallo inherited,

herzlich willkommen in der DP.

Ich erhalte keine Fehlermeldung beim Compilieren. Kannst Du uns ein wenig mehr Code zeigen?


Mit freundlichen Grüßen

engine

marabu 19. Dez 2005 20:43

Re: Problem Mit FloatToStr
 
Herzlich willkommen in der Delphi-PRAXiS.

Zitat:

Zitat von inherited
wobei erg2 ein String und erg5 ein real ist.

Offensichtlich scheint das nicht ganz zu stimmen. Du kannst es überprüfen, indem du die fehlerhafte Zeile auf Kommentar setzt und folgende Prozedur aufnimmst:

Delphi-Quellcode:
procedure ConversionTest;
var
  s: string;
  r: real;
begin
  r := 1.5;
  s := FloatToStr(r);
end;
Wenn die Prozedur fehlerlos übersetzt wird, dann musst du mal nachforschen, welchen Typ erg2 und erg5 bei dir wirklich haben.

Grüße vom marabu

inherited 19. Dez 2005 20:49

Re: Problem Mit FloatToStr
 
ich hab jetzt ein bisschen rumgedebugged(was für ein wort) und es scheint an meiner if-abfrage zu liegen dessen teil der o.g. quelltext ist und nicht daran. Vielen dank trotzdem
ach ja auch da find ich den fehler nicht(nicht erschrecken das ist gerade so verkompliziert weil ich den fehler gesucht hatte und es deshalb zerlegt in einzelne schritte)
Delphi-Quellcode:
var
  erg2: String;
  erg3: Integer;
  erg4, erg5: Real;

//...

procedure Runden(erg1: String);
var i: Integer;
for i := 1 to length(erg1) do
  begin
    erg2:=erg2+'0';
    erg2[i]:=erg1[i];
    if erg1[i]= ',' then
    begin
      erg2[i+1]:=erg1[i+1];
      erg2[i+2]:=erg1[i+2];
      if erg1[i+3]='5' or if erg1[i+3]='6' or if erg1[i+3]='7' or if erg1[i+3]='8' or if erg1[i+3]='9' then
      begin
        erg3:=round(StrToInt(erg2)*100);
        erg2:=IntToStr(erg3);
        erg4:=StrToFloat(erg2);
        erg5:=erg4/100.0;
        erg2:=FloatToStr(erg5);
        erg2:=IntToStr(erg3);
      end;  //hier liegt der fehler
    end;
  end;
end;

marabu 19. Dez 2005 21:07

Re: Problem Mit FloatToStr
 
Besser, du schreibst mal, was du erreichen willst. Was geht rein in deine Prozedur (ein string, welches Format?), was soll raus kommen? Wieder ein String? Du verwendest ohne Not globale Variablen (erg2, erg3, ...), die in deiner Prozedur nicht initialisiert werden. Der Name Runden() suggeriert ja schon etwas. Welches Rundungsverfahren willst du umsetzen? Welche Genauigkeit bzw. wieviele Nachkommastellen soll das Ergebnis haben?

marabu

inherited 19. Dez 2005 21:12

Re: Problem Mit FloatToStr
 
sooviele fragen?? nagut also mit erg2 soll man weiterarbeiten(warum ich keine funktion nutze: keine ahnung) deswegen global
erg3,4,5 sind deshalb global weil ich sie nur zur fehlerüberprüfung genutzt habe und sie eben mal deklariert hab.
was da reingeht ist eine zahl als string im format 100,01 o.ä. es soll beträge die eingegeben werden auf 3 nachkommastellen runden

Für alternativen/verbesserungen bin ich stets offen, solang sie delphi 3 kompatibel sind

edit: kann es sein das es am if ... or if... liegt?

marabu 19. Dez 2005 21:22

Re: Problem Mit FloatToStr
 
Das geht nicht?

Delphi-Quellcode:
function Gerundet(rValue: real): real;
begin
  Result := Round(rValue * 1000) / 1000;
end;
marabu

inherited 19. Dez 2005 21:24

Re: Problem Mit FloatToStr
 
HEY, das is ja GENIAL warum ich da nicht selbst drauf gekommen bin...
DANKE

marabu 19. Dez 2005 21:38

Re: Problem Mit FloatToStr
 
Einen Pferdefuß hat dieser Ansatz - er beschränkt die Zahl der signifikanten Stellen in deiner Real-Variablen auf etwa 8. Vielleicht möchtest du deinen String-Ansatz ja noch etwas im Auge behalten...

Gute Nacht

marabu

alzaimar 19. Dez 2005 22:04

Re: Problem Mit FloatToStr
 
Hi marabu,
Ich runde immer auf und verwende Extended:
Delphi-Quellcode:
function Gerundet(rValue: Extended): Extended;
begin
  Result := Round(0.5 + rValue * 1000) / 1000;
end;
Irgendwann hab ich mir das 'Real' abgelehnt. Irgendwer im Forum hat mich darauf gebracht, lieber CPU-native Typen zu verwenden. Double und Extended sind die wohl.

So jetse ...chhrrr....chhhrrrr...

lizardking 19. Dez 2005 22:30

Re: Problem Mit FloatToStr
 
Hm... manchmal frage ich mich wirklich was der bessere Weg ist. Neue Loesungen zu zeigen oder Fehler zu berichtigen ? Ist ja schoen und gut, wenn der Threadstarter nun eine Loesung bekommt, aber :

Delphi-Quellcode:
if erg1[i+3]='5' or if erg1[i+3]='6' or if erg1[i+3]='7' or if erg1[i+3]='8' or if erg1[i+3]='9' then
Ueber dieses sonderbare Konstrukt verliert niemand ein Wort. *gruebel*. Ist ja nicht schlimm, wenn man sowas mal verzapft, aber wenn nur fertige Loesungen angeboten werden anstatt mal ein

Delphi-Quellcode:
if (erg1[i+3]='5') or (erg1[i+3]='6') or (erg1[i+3]='7') or (erg1[i+3]='8') or (erg1[i+3]='9') then
anzubieten, dann gibt's erst einmal ein Erfolgserlebnis -- die naechste or-Verknuepfung auf eigene Faust wird aber definitiv wieder in die Hose gehen. Ich selber finde das sehr viel hilfreicher, wenn man mir ERST erklaert, was ich auf jeden Fall verkehrt gemacht habe und DANN, wie ich's noch besser und eleganter loesen kann ;-)

Gruesse,

Lizzy

Brüggendiek 19. Dez 2005 22:33

Re: Problem Mit FloatToStr
 
Hallo inherited!

Auch wenn das Problem an sich gelöst ist, noch der Grund für die Fehlermeldung - damit beim nächsten Mal nicht wieder eine Frage nötig ist.

Der Fehler liegt in dieser Zeile:
Delphi-Quellcode:
if erg1[i+3]='5' or if erg1[i+3]='6' or if erg1[i+3]='7' or if erg1[i+3]='8' or if erg1[i+3]='9' then
Das ist so syntaktisch falsch und verursacht die Fehlermeldung! Richtig ist:
Delphi-Quellcode:
if (erg1[i+3]='5') or (erg1[i+3]='6') or (erg1[i+3]='7') or (erg1[i+3]='8') or (erg1[i+3]='9') then
Die Fehlermeldung bei einer tieferen Zeile kommt daher, daß Deine if-Zeile nicht korrekt ausgewertet werden kann und deshalb die nächste Zeile als zum Statement gehörend betrachtet wird.

Dasselbe findet man ja auch bei einem vergessenen Semikolon am Ende der Anweisung - dann ist die Folgeanweisung angeblich fehlerhaft.

Gruß

Dietmar Brüggendiek

Edit: Roter Kasten, wo bist du?

marabu 20. Dez 2005 06:31

Re: Problem Mit FloatToStr
 
Guten Morgen, Lizzy.

Zitat:

Zitat von lizardking
manchmal frage ich mich wirklich was der bessere Weg ist. Neue Loesungen zu zeigen oder Fehler zu berichtigen ?

Das frage ich mich jedes mal vorher und treffe dann eine Entscheidung, die völlig offen ist, weil sie von einer Vielzahl von Faktoren abhängt. Einer der wichtigsten ist dabei meine für die DP verfügbare Zeit.

Es ist nicht immer leicht den Kenntnisstand des Hilfesuchenden korrekt einzuschätzen und auch die Probleme selbst werden oft diffus vorgetragen. Im konkreten Fall kam ich zu dem Schluss, dass es um das Rundungsergebnis geht. Ich hätte die D7 Signatur von Round (hallo alzaimar) posten können und fertig, aber leider konnte ich mit meinem löchrigen Gedächtnis nicht mit Bestimmtheit sagen, dass es in D3 schon den Datentyp Extended gab.

Hätte ich den Eindruck gewonnen, es ginge mehr um den Weg als das Ziel, dann hätte ich aus didaktischen Gründen nicht bei der Klammerung aufgehört:

Delphi-Quellcode:
// besser so
if (erg1[i+3]='5') or (erg1[i+3]='6') or (erg1[i+3]='7')
or (erg1[i+3]='8') or (erg1[i+3]='9') then
begin
end;

// und noch besser so
if erg1[i+3] in ['5'..'9'] then
begin
end;
Und selbst hier darf dann nicht Schluss sein - aber ich muss meine Zeit einteilen. Sollte ich mich wieder einmal falsch entschieden haben, so tut es mir leid. Es wird noch öfter vorkommen. Ich werde damit leben müssen. Und die community auch.

Freundliche Grüße vom marabu

alzaimar 20. Dez 2005 07:33

Re: Problem Mit FloatToStr
 
Zitat:

Zitat von marabu
Das geht nicht?
Delphi-Quellcode:
function Gerundet(rValue: real): real;
begin
  Result := Round(rValue * 1000) / 1000;
end;

Zitat:

Zitat von inherited
HEY, das is ja GENIAL warum ich da nicht selbst drauf gekommen bin...
DANKE

Zitat:

Zitat von lizardking
Hm... manchmal frage ich mich wirklich was der bessere Weg ist. Neue Loesungen zu zeigen oder Fehler zu berichtigen ?

:gruebel: Frag inherited.

inherited 20. Dez 2005 14:14

Re: Problem Mit FloatToStr
 
ich brauche ja nicht mehr als 3 angezeigte stellen, mit der 4. wird gerundet, also sollten 8 mehr als genug sein.
Jetzt wo dus das mit den Klammern sagst... omfg bin ich dumm. blackout oder so (wo habt ihr eigentlich eure höheren delphi-versionen her)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:30 Uhr.

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