Überprüfung von picture einer Variable

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

Antworten
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Überprüfung von picture einer Variable

Beitrag von stevie »

Kann man eigentlich eine Variable auf ein bestimmtes Format (picture) überprüfen?
Bsp: var1=1.5 oder
var1=+0.45E +00
Jetzt die Prüfung, ob die Variable im Format 9.9 oder im Format #9.99E #99 vorliegt und dann entsprechende Enscheidung, ob umgewandelt werden muss oder nicht.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Also intern in der Variable ist entweder eine 32 Bit Integer oder eine Fließkommazahl gespeichert (Pablo hat dazu was geschrieben im DevCon Ordner).

Wenn man einfach (aus dem Gedächtnis)

Code: Alles auswählen

nVar1 := 1234
nVar2 := 1234.0
? nVar1 -> 1234
? nVar2 -> 1234.00
aufruft sieht man die Darstellungsunterschiede.
Der interne Wert ist unabhängig von der Darstellung, ab einer gewissen Größe kann die Fließkommazahl aber nicht mehr genau dargestellt werden, sondern nur noch als Vielfaches einer 10er Potenz.
Gruß
Hubert
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Beitrag von stevie »

brandelh hat geschrieben:Also intern in der Variable ist entweder eine 32 Bit Integer oder eine Fließkommazahl gespeichert (Pablo hat dazu was geschrieben im DevCon Ordner).

Wenn man einfach (aus dem Gedächtnis)

Code: Alles auswählen

nVar1 := 1234
nVar2 := 1234.0
? nVar1 -> 1234
? nVar2 -> 1234.00
aufruft sieht man die Darstellungsunterschiede.
Der interne Wert ist unabhängig von der Darstellung, ab einer gewissen Größe kann die Fließkommazahl aber nicht mehr genau dargestellt werden, sondern nur noch als Vielfaches einer 10er Potenz.
du hast mich nicht richtig verstanden. Also in Variable, die Zeichen enthält (Typ C) ist entweder eine Fließkommazahl oder Exponentialzahl gespeichert. Und jetzt soll halt genau danach ausgewählt werden.
Es geht nämlich darum: Ich habe ein Eingabefeld (picture #9.9999E#99) in dem Exponentialwerte eingegeben werden. Es gibt über 1000 Datensätze, die damit bearbeitet werden können. Einmal alle 12, 13, 14 oder Felder soll das Feld eine Fließkommazahl enthalten (picture 999). Da dieses Feld zur Berechnung genutzt wird, aber auch alle anderen, kommt es vor das in einer Aufgabe plötzlich 100+"+1.464E01" drinsteht, was logischerweise fehlschlägt. Daher möchte ich halt am Variableninhalt unterscheiden, ob ein Ersatzwert benutzt werden muss oder nicht.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Nun,
dann kannst Du doch ganz einfach nach einem E in der Zeichenkette greppen....

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
dirk
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 29
Registriert: Mi, 05. Jul 2006 15:17
Wohnort: 26689 Augustfehn

Beitrag von dirk »

So wie Martin es schon angedeutet hat, nach dem "E" suchen und darüber die Berechnung starten.
Beispielcode:
[code]LOCAL aDaten:={"1.5", "+0.45E+00", "+0.45E+02", "-1000E-03"}
LOCAL i:=0

FOR i:=1 to len(aDaten)
IF "E"$aDaten[i]
nVar1:=val(substr(aDaten[i],1,;
at("E", aDaten[i])-1));
*10**val(substr(aDaten[i],at("E", aDaten[i])+1))
ELSE
nVar1:=val(aDaten[i])
ENDIF
? aDaten[i], nVar1
NEXT[/code]
dirk
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 29
Registriert: Mi, 05. Jul 2006 15:17
Wohnort: 26689 Augustfehn

Beitrag von dirk »

Leider hat das mit dem markieren des Codestextes an anschließendem Klick auf den Code nicht funktioniert.
Ich vermute ich muß das Häkchen, das bei "BBCode in diesem Beitrag deaktivieren" gesetzt war, herausnehmen, oder ?
Hier der Test:

Code: Alles auswählen

   LOCAL aDaten:={"1.5", "+0.45E+00", "+0.45E+02", "-1000E-03"}
   LOCAL i:=0

   FOR i:=1 to len(aDaten)
      IF "E"$aDaten[i]
         nVar1:=val(substr(aDaten[i],1,at("E", aDaten[i])-1))*10**val(substr(aDaten[i],at("E", aDaten[i])+1))
      ELSE
         nVar1:=val(aDaten[i])
      ENDIF
      ? aDaten[i], nVar1
   NEXT
Ja, jetzt hat es funktioniert ! Wozu ist man sonst auch Rookie ?
Ich hoffe, es hilft weiter.
dirk
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

dirk hat geschrieben:...
Ich vermute ich muß das Häkchen, das bei "BBCode in diesem Beitrag deaktivieren" gesetzt war, herausnehmen, oder ?
...
Ja, jetzt hat es funktioniert ! Wozu ist man sonst auch Rookie ?
...
oben rechts ist in den eigenen Messages [EDIT] als Schaltfläche zu sehen.
Wenn du da drauf wärst, hättest du die ursprüngliche Message ändern können und niemand hätte es mitbekommen (solange es die letzte Meldung ist, sonst erscheint ein Hinweis).
Gruß
Hubert
dirk
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 29
Registriert: Mi, 05. Jul 2006 15:17
Wohnort: 26689 Augustfehn

Beitrag von dirk »

Vielen Dank Hubert !
das hatte ich noch nicht entdeckt.

dirk
Antworten