Überprüfung von picture einer Variable
Moderator: Moderatoren
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Überprüfung von picture einer Variable
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.
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.
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
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)
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.
Wenn man einfach (aus dem Gedächtnis)
Code: Alles auswählen
nVar1 := 1234
nVar2 := 1234.0
? nVar1 -> 1234
? nVar2 -> 1234.00
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
Hubert
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
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.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)
aufruft sieht man die Darstellungsunterschiede.Code: Alles auswählen
nVar1 := 1234 nVar2 := 1234.0 ? nVar1 -> 1234 ? nVar2 -> 1234.00
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.
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.
- Martin Altmann
- Foren-Administrator
- Beiträge: 16586
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 116 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Nun,
dann kannst Du doch ganz einfach nach einem E in der Zeichenkette greppen....
Viele Grüße,
Martin
dann kannst Du doch ganz einfach nach einem E in der Zeichenkette greppen....
Viele Grüße,
Martin
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.
-
- Cut&Paste-Entwickler
- Beiträge: 29
- Registriert: Mi, 05. Jul 2006 15:17
- Wohnort: 26689 Augustfehn
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]
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]
-
- Cut&Paste-Entwickler
- Beiträge: 29
- Registriert: Mi, 05. Jul 2006 15:17
- Wohnort: 26689 Augustfehn
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:
Ja, jetzt hat es funktioniert ! Wozu ist man sonst auch Rookie ?
Ich hoffe, es hilft weiter.
dirk
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
Ich hoffe, es hilft weiter.
dirk
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
oben rechts ist in den eigenen Messages [EDIT] als Schaltfläche zu sehen.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 ?
...
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
Hubert