-
 Zitat von hel400
Also im Wettbewerb "wer schafft den unleserlichsten Code" gibt's ja hier schon etliche Anwärter ...
Nicht herummaulen, sondern selber besser machen!
-
@Birgitta
heute hast Du mal die Aufgabe nicht ganz verstanden
@hel400
aber toll was es alles gibt oder?
@Baldur
Früher (als wir noch einen Kaiser hatten) wollt ich immer RegEx lernen. Wer kann sich solch eine, sicherlich sehr mächtige, Syntax merken
@Camouflage
mit Schleife, eindeutig zu lang (aber lesbar)
@Robert
1 mit Sternchen! Einfach, lesbar kurz. Wie man das von einem Robert erwartet!
Schöne Feiertage, guten Rutsch
Robi
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
bääähhh,
so lang muss mein Code gar nicht sein und ich behaupte mal, so ist er der Lesbarste und Schnellste, auch wenn Robert's der Raffinierteste sein mag.
Code:
dcl-s pos int(3);
dcl-s ix int(3);
for ix = 1 to 5;
pos = %check('0123456789' : %subst(feld:ix:1));
if pos = 0;
feld = ' ' + feld;
leave;
endif;
endfor;
Auch von mir, Frohe Festtage und ein gutes neues Jahr.
(Hoffentlich gibt es mal aus diesem Corona Loop einen Exit)
Karl.
kf
-
Nochmal ein bisschen unleserlicher Code, diesmal mit REGEXP! (einfacher als der Code von Baldur!)
Code:
Exec SQL Set :YourVar = Case When RegexP_Like(Left(:YourVar, 5), '[A-Z ]{5}')
then ''
Else Space(5)
End Concat :YourValue;
... ansonsten soll sich jeder aussuchen, was ihm am Besten gefällt.
-
Hier noch ein weiteres Beispiel:
Code:
EXEC SQL SET :rpg_var = regexp_replace (:rpg_var, '^(.{5})(?=[A-Z ])', ' $1'))
Kurze Beschreibung:
regexp_replace({Source String}, {Such Pattern}, {Ersetzen mit ...})
Suchpattern:
^ --> Anfang der Zeichenkette, sonst hättest du ein ungewolltes Verhalten, wenn du später auch noch 5 Buchstaben/Blanks hast
(.{5}) --> Beliebiges Zeichen 5 mal
(?=[A-Z ]) --> Prüft ob der vorherige Wert (Beliebige 5 Zeichen) auf A-Z und Blank
' $1' --> Wenn die Prüfung TRUE ergibt, wird es mit diesem Wert ersetzt.
lg Andreas
-
und nochmal rein RPG
**free
dcl-s feld1 char(25) inz('A123456789012345678901234');
dcl-s feld2 char(25) inz('A 12345678901234567890123');
dcl-s feld3 char(25) inz('A B C12345678901234567890');
dcl-s Ausgabe varchar(50) inz;
dcl-s pos zoned( 5: 0 );
pos = 1;
ausgabe = feld1;
dou pos > 5;
if %subst(feld1 : pos:1) >= x'F0' and %subst(feld1 : pos:1) <= x'F9';
ausgabe = ' ' + %subst(ausgabe :1:25-pos);
endif;
pos += 1;
enddo;
Viele Wege führen nach Rom bzw. zum Ergebnis
Programmierung
-
... da führen einige an Rom vorbei (wenn der String nicht Knast(#)-frei ist, Sonderzeichen enthält, Steuerzeichen enthält, mit -12345 anfängt oder 365,25 beginnt): knapp vorbei ist auch daneben.
D*B
-
@K_Tippi:
Die Aufgabe ist nicht gelöst, da das Voranstellen von Leerzeichen nur erfolgen soll, wenn insgesamt die Bedingung nicht erfüllt ist.
@Andreas:
Die Prüfung sollte wohl auf "Not True" gesetzt werden "...?!...".
-
 Zitat von Fuerchau
@Andreas:
Die Prüfung sollte wohl auf "Not True" gesetzt werden "...?!...".
Ja vom logischen Aspekt müsste es so sein wie du geschrieben hast, das korrekte Ergebnis bekommst du jedoch mit dem von mir angegebenen Beispiel.
-
Ok, muss hier noch bis Mittags die Zeit totschlagen - daher
--> HIER DIE ULTIMATIVE LÖSUNG:
Code:
​
C MOVE INPUT FELD24 24
C MOVE INPUT FELD23 23
C MOVE INPUT FELD22 22
C MOVE INPUT FELD21 21
C MOVELINPUT F1 1
C F1 COMP 'A' 30
C N30 F1 COMP 'Z' 30
C F1 COMP ' ' 31
C 30N31 GOTO MOVE$
C MOVELFELD24 F1 1
C F1 COMP 'A' 30
C N30 F1 COMP 'Z' 30
C F1 COMP ' ' 31
C 30N31 GOTO MOVE$
C MOVELFELD23 F1 1
C F1 COMP 'A' 30
C N30 F1 COMP 'Z' 30
C F1 COMP ' ' 31
C 30N31 GOTO MOVE$
C MOVELFELD22 F1 1
C F1 COMP 'A' 30
C N30 F1 COMP 'Z' 30
C F1 COMP ' ' 31
C 30N31 GOTO MOVE$
C MOVELFELD21 F1 1
C F1 COMP 'A' 30
C N30 F1 COMP 'Z' 30
C F1 COMP ' ' 31
C 30N31 GOTO MOVE$
C GOTO ENDE
C MOVE$ TAG
C MOVEL' ' FELD30 30
C MOVE INPUT FELD30
C MOVELFELD30 INPUT 25
C ENDE TAG
C SETON LR
:-)))) wünsche allen noch ein frohes Fest und schöne Feiertage :-)))
-
Ich glaube das muss ein Praktiker beantworten :-)
Wenn ich mir deine Konstante "AlphaChk" anschaue, dann sieht man ja schon was für Zeichen in den ersten 5 Stellen geprüft werden sollen. Um das nicht all zu kryptisch zu machen hätte ich das so gelöst:
Einfach die einzelnen Zeichen der ersten 5 Stellen prüfen ob sie in deiner Konstante vorhanden sind.
if %scan(%subst(Feld:1:1):AlphaChk) = 0 or %scan(%subst(Feld:2:1):AlphaChk) = 0
or %scan(%subst(Feld:3:1):AlphaChk) = 0 or %scan(%subst(Feld:4:1):AlphaChk) = 0
or %scan(%subst(Feld:5:1):AlphaChk) = 0;
Feld = 'bbbbb' + %trimr(Feld);
endif;
-
Wie immer gibts viele Möglichkeiten. In der Lösung von Hel400 ist nicht berücksichtigt, dass in der EBCDIC-Range zwischen 'A' und 'Z' auch noch ein paar Sonderzeichen liegen.
Ein %check() liefert die 1. Position des nicht erlaubten Zeichens.
Also noch simpler:
if %check('ABCD.......XYZ ':Feld) < 6;
Similar Threads
-
By alex61 in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 20-09-19, 09:43
-
By TheDevil in forum NEWSboard Programmierung
Antworten: 6
Letzter Beitrag: 05-06-14, 22:47
-
By Michael1 in forum IBM i Hauptforum
Antworten: 5
Letzter Beitrag: 18-08-05, 15:50
-
By HoScHiE in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 13-10-01, 13:36
-
By HoScHiE in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 02-10-01, 17:16
Tags for this Thread
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks