Mittwoch, 5. Oktober 2011

Stringinvertierung - segmentiert und komplett / inverting strings - segmented and complete

Im Microsofts deutschem Foxpro Forum kam vor einigen Wochen die Frage wie ein String von A nach Z, B nach Y, C nach X usw. invertiert werden kann.

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