PDA

View Full Version : RPG im String ein Zeichen ersetzen



ExAzubi
08-08-08, 11:50
Hallo zusammen.

Ich habe einen String und dort muss ich ein Zeichen z.B. '%' , welches auch mehrfach mittendrin vorkommen kann, durch z.B. Proz. ersetzen.

Leider funktioniert die Replace Funktion nicht, da diese knallhart auch die hinteren Zeichen überschreibt.

Bsp.

Der Satz soll von 4% auf 5% angehoben werden.

Ergebnis.
Der Satz soll von 4 Proz. auf 5 Proz. angehoben werden.


Hat einer einen Lösungsvorschlag?

Danke an alle Helfenden.

cbe
08-08-08, 15:23
Hallo ExAzubi,

schön, dass alle dieselben Probleme haben...

Ich hatte damals nichts gefunden und es programmiert. Vielleicht hilft Dir das?

Das Bsp ersetzt in einem String die Zeichenkette SWNETIxxx durch den Parameter und füllt auf 10 Zeichen auf.

Ohne Gewähr, kann man bestimmt auch noch schöner machen.

Gruß
Christian


*
*----- Prototypen
D pReplace PR
D $opt 100 const options(*varsize)
D $val 100 const options(*varsize)
D $vallen 5 0 const
D $cmd 200
*
...
callp pReplace('SWNETIxxx' :p$outq :10:z)
...

P pReplace B
*========
*
D pReplace PI
D $opt 100 const options(*varsize)
D $val 100 const options(*varsize)
D $vallen 5 0 const
D $cmd 200
*
C ' ' checkr $opt optlen 5 0 50
C n50 goto pReplaceX
C if %subst($opt: 1 :optlen) =
C %subst($val: 1 :$vallen)
C goto pReplaceX
C endif
*
C $vallen subst(p) $val:1 val 100
*
*--- Parameter ggf. einsetzen
C move *zero n5 5 0
C eval n5 = %scan(%trimr($opt):$cmd)
C n5 dowgt *zero
*
C n5 ifeq *zero
C eval $cmd = %trim(val) +
C %subst($cmd: optlen)
C else
C eval $cmd = %subst($cmd: 1: n5-1) +
C %trim(val) +
C %subst($cmd: n5+optlen)
C endif
*
C eval n5 = %scan(%trimr($opt):$cmd)
C enddo
*
C pReplaceX tag
* =========
P pReplace E
*

henke
11-08-08, 08:03
Habe ich etwas falsch verstanden? Warum führt die %replace Funktion nicht zum Ergebnis?



d String s 100a

c eval String = 'Der Satz soll von 4% auf 5%'
c +' angehoben werden.'

c do *hival
c '%' scan String
c if not %found
c leave
c else
c eval String=%replace(' Proz.':String:
c %scan('%':String):1)
c endif
c enddo

c eval *inlr='1'


Gruß Henke

Bernd Wiezroek
11-08-08, 16:55
Ich denke das von mehreren Zeichen die im String orkommen nur ein Bestimmtes Ersetzt werden soll. Replace ersetzt aber alle Zeichen.

Das Problem ist also erstmal das zu ersetzende Zeich zu lokalisieren.

Das kann man z.B. mit CHECK machen

oder man schreibt den String in ein Arry und liest ihn Zeichenweise.

henke
12-08-08, 06:11
Die Position des zu ersetzende Zeichen ermittelt man doch mit


%scan('%':String)


und bei der %replace Funktion gibt man doch an in welcher Länge ersetzt werden soll.

%REPLACE(replacement string: source string{:start position {:source length to replace}})

Ggf. sogar 0, dann wird nichts im Ursprungsstring ersetzt, sondern nur der neue Text eingefügt.

ExAzubis Problem war doch, dass die hinteren Zeichen Knallhart überschrieben werden, das kann ich irgendwie nicht nachvollziehen. Selbst bei der Benutzung von 2 Parametern wird der neue Text nur eingefügt und nichts überschrieben.

http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=/books/c092508602.htm