Im folgenden Codebeispiel steht wahlweise eine segmentierte Invertierung (nur für Buchstaben und Zahlen) sowie eine komplette Invertierung (sämtlich Zeichen der ASCII Tabelle = 0-255) zur Verfügung.
Vor der eigentlichen Funktion findet sich wie immer ein Funktionstest. Also einfach den Code markieren und über die Zwischenablage in ein PRG kopieren... ;-)
* // Stringinhalt unterscheidet sich von der Anzeige
* // da nicht darstellbare Zeichen enthalten sein können
* // string content may differ from displayed value due
* // to non-displayable chars
* // test - start --------------------------------
CLEAR
lcTest = [Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm Nn Oo Pp Qq Rr Ss Tt Uu Vv Ww Xx Yy Zz]
* // Original
?lcTest
* // segmentiert / segemented
?InvertString( lcTest )
* // komplett / complete
?InvertString( lcTest , 1 )
?
lcTest = [0 1 2 3 4 5 6 7 8 9]
* // Original
?lcTest
* // segmentiert / segemented
?InvertString( lcTest )
* // komplett / complete
?InvertString( lcTest , 1 )
* // test - ende ---------------------------------
FUNCTION InvertString as String
LPARAMETERS vString as String, vVersion as Integer
* // Param #1: string to invert
* // Param #2: 0|1 (optional)
* // 0 or ommit = sequenced ascii
* // 1 = complete ascii range
LOCAL i as Integer, liAsc as Integer, lcReplace as String
vVersion = EVL( vVersion , 0 )
FOR i = 1 TO LEN( vString )
liAsc = ASC( SUBSTR( vString , i , 1 ) )
DO CASE
* // complete ASCII
CASE vVersion = 1
lcReplace = CHR( BITNOT( liAsc ) + 256 )
* // A - Z
CASE BETWEEN( liAsc , 65 , 90 )
lcReplace = CHR( ABS( 25 - ( liAsc - 65 ) ) + 65 )
* // a - z
CASE BETWEEN( liAsc , 97 , 122 )
lcReplace = CHR( ABS( 25 - ( liAsc - 97 ) ) + 97 )
* // 0 - 9
CASE BETWEEN( liAsc , 48 , 57 )
lcReplace = CHR( ABS( 9 - ( liAsc - 48 ) ) + 48 )
* // anything else
OTHERWISE
lcReplace = SUBSTR( vString , i , 1 )
ENDCASE
vString = STUFF( vString , i , 1 , lcReplace )
ENDFOR
RETURN vString
ENDFUNC
Keine Kommentare:
Kommentar veröffentlichen