PDA

View Full Version : String zeichen finden under ersetzten.



kr1s
28-08-06, 10:53
Hallo,

aufgrund einer prüfziffernberechnung, muss ich in einem String alle Buchstaben duch Nummern (10 bis 35, wobei A=10, B=11,... Z=35 ist) ersetzt werden.

Da ich eigentlich nur C++ Programmiere, wollte ich mal fragen ob ihr für mich die passenden Funktionen hättet.

Also einmal, zeichen auf stelle x prüfen
(könnte ja man ja mit SubSt lösen)

Dann wäre eine Funktion, zeichen an stelle x löschen ganz gut.

Und zeichenkette an stelle x einfügen.

weil ich in RPG keine 30 Stellen numerisch teilen kann, müsste ich später dann auch noch wissen, wie ich einen SubSt in ein Numerisches feld schiebe.

Wenn ihr Quellen zum nachlesen habt, nehe ich diese auch gerne an.

Danke,
Gruß.

kr1s
28-08-06, 11:22
Noch ein Nachtrag:

Zu dem ersten Problem, dass ich aus dem 'A' eine '10' usw machen muss, könnte ich in c++ einfach den Ascii wert überprüfen und von diesen wert 55 abziehen. So käm ich dann bei 'A' z.b. auf die 10.

Hier ein beispiel:

Von i = 1, tue solange i < länge des Strings
{
wenn ( zeichen an position i > 'A' und zeichen an position i < 'Z')
{
//Dann ist es ein zeichen.
einfügeZahl = (dez.Wert)zeichen an position i - 55;
}
sonst
{
einfügeZahl = zeichen an position i
}
}

Fuerchau
28-08-06, 11:33
Da die AS/400 in EBCDIC arbeitet, hast du da schlechte Karten. A-Z sind nicht lückenlos aufsteigend.

Ich würde die Werte 0-9 und A-z in eine Tabelle stellen und dann per LOKUP jedes Zeichen in der Tabelle suchen.
Der "Index - 1" ergibt dann den Wert für die Berechnung.
Eine Ersetzung des Originalstrings würde ich nicht vornehmen.

kr1s
28-08-06, 12:59
ok, ist es mir denn möglich den String wie ein array zu behandeln. Hab eben durch zufall bei Wikipedia das hier gefunden.

/FREE

FOR k = 1 TO %elem(Array);
Array(k) = k;
ENDFOR;

EVAL *INLR = *ON;

/END-FREE</pre>

Hatte mich schon gefreut, so wie in C einfach mit () hinter dem feldnamen die einzellnen zeichen ansprechen zu können. Dies mag der compiler aber nicht :(.

Ich werds jetzt mit SubSt versuchen. Wenn ihr was einfacheres wisst, bitte her damit ;).

Danke.

Fuerchau
28-08-06, 14:03
Hier werden verschiedene Sachen gemischt:

%elem(Array) = Anzahl definierter Elemente eines Arrays.

Um eine Zeichenkette anzusprechen gibts %SUBST(STRING:POS:LÄNGE).

Um ein Zeichen in einem Array zu suchen nutze %LOKUP.

Pikachu
28-08-06, 15:37
Hallo kr1s!

Probier' mal folgendes (ohne Gewähr):


D STRINGDS DS
D STRING 30A
D BYTE 1A Dim(30) Overlay(STRING)
D WERT 3U 0 Dim(30) Overlay(STRING)
D NUM S 3U 0 Inz
D************************************************* *********************
D BYTES C 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
D WERTE C X'0A0B0C0D0E0F101112131415161718-
D 191A1B1C1D1E1F20212223'
D************************************************* *********************
C MOVEL 'QWERTZ' STRING
C BYTES:WERTE XLATE STRING STRING
C MOVE WERT(5) NUM
C SETON LR

Gruß
Jürgen