Anmelden

View Full Version : RPG Anfänger-Frage



Seiten : 1 [2]

Fuerchau
19-10-07, 12:04
Die Performance ist da eher vernachlässigbar, da bei deiner Methode die Variable erst mal temporär in varsize umkopiert wird, die restlichen Leerzeichen entfernt werden, dann die länge berechnet und anschließend die Variable wieder verworfen wird.
Ausserdem werden die linksstehenden Leerzeichen ja trotzdem bearbeitet.

%size wird bereits zur Compile-Zeit ausgelöst.

Für die Performance-Freaks:

d MyDS DS
d MyNum 18p 0
d MyChar 18
d MyInd 5I 0
d MyDig 1
d MyZDig 1 0 overlay(MyDig)

:
MyNum = MyNum*10+MyZDig;
:

B.Hauser
20-10-07, 17:48
Hallo,

Wenn's um die Performance geht, würde ich zunächst entweder die Built-in-Funktion %INT oder %DEC verwenden um die alphanumerische Nr. zu konvertieren. Sollten in dem String ungültige Zeichen vorhanden sein, erfolgt ein Abbruch. Diesen kann man über eine Monitor-Group abfangen werden. Anstatt im Fehlerfall jedes Zeichen einzeln zu prüfen, würde ich direkt nach den ungültigen Zeichen suchen und diese aus dem String entfernen.



D Digits C const('1234567890 ')
D Pos S 3U 0
************************************************** ***********
/Free
Monitor;
Clear MyNum;
If MyAlpha <> *Blanks;
MyNum = %Int(MyAlpha);
EndIf;
On-Error;
DoU Pos = *Zeros;
Pos = %Check(Digits: MyAlpha);
If Pos <> *Zeros;
MyAlpha = %Replace('': MyAlpha: Pos: 1); //Entfernen ungült. Zeichen
EndIf;
EndDo;
MyNum = %Int(MyAlpha);
EndMon;
/End-Free


Birgitta

loeweadolf
21-10-07, 01:04
Falls das Ergebnis alphanumerisc sein soll, dann eine kleine Abwandlung von Baldurs ausgezeichneter Lösung:


d MyNum 18
d MyChar 18
d MyInd 5I 0
d MyDig 1

MyNum = *blanks;
for MyInd =1 to %size(MyChar);
MyDig = %subst(MyChar:MyInd:1);
if %check('0123456789':myDig) = *zero;
MyNum = %trim(MyNum) + MyDig;
endif;
next;

Fuerchau
21-10-07, 17:32
Wie immer, gibt es viele Varianten, ob es tatsächlich messbare Unterschiede gibt, k.A., aber wenn in 99,9% aller Fälle Sonderzeichen in der Nummer vorhanden sind, ist der erste Test eben meistens bereits unnötig.

Auch was die Umwandlung nach CHAR angeht, so ist Ludgers Lösung nicht ganz so gut ;), besser wäre am Ende:

a) MyChar = %char(MyNum); // Linksbündig ohne Vornullen
b) MyChar = %editc(MyNum:'X'); // Mit vornullen

Somit entfällt das ständige trimmen und catten.