2011-03-10 9 views
5

Il est facile de transformer un nombre en une valeur alphanumérique basée sur la base 16 dans SAS en utilisant le format $ HEX. Maintenant, je cherche un moyen facile de le faire avec radix 36 (10 chiffres & 26 lettres).Conversion numérique en valeur alphanumérique basée sur la base 36

Exemples:

  • 100 -> '2s'
  • 2000 -> '1jk'
  • 30000 -> 'N5C'
  • 400000 -> '8kn4'

En Java, vous pouvez le faire par Integer.toString(mynumber, 36). Des idées pour faire cela dans SAS Base?

Répondre

3

Malheureusement, il existe un moyen facile de faire des formats d'utilisation, mais l'étape de données suivante devrait résoudre le problème. Cela fonctionne uniquement pour les entiers positifs.

data _null_; 
infile cards; 
input innumber; 
number = innumber; 
format base $32.; 
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 
if number = 0 then base = '0'; 
else 
    do while (number ne 0); 
    mod = mod(number, length(alphabet)); 
    div = floor(number/(length(alphabet))); 
    base = cats(substr(alphabet,mod+1,1),base); 
    number = div; 
    end; 
put innumber= base=; 
cards; 
0 
100 
2000 
30000 
400000 
; 
run; 
+0

Je connaissais déjà l'algorithme en Java pour radix> 36 mais je n'avais pas vu l'implémentation SAS auparavant. Merci! – TechnoCore

1

Il n'y a pas de fonctionnalité intégrée pour cela. Vous pouvez modéliser itérativement 36 votre nombre, puis diviser par 36 jusqu'à ce que ce qui reste soit zéro. Pour convertir la séquence de modulos vous devez ajouter 48decimal ou 30hex pour obtenir le caractère ascii dans le cas des chiffres 0-9 et 101decimal ou 65hex pour obtenir le caractère ascii dans le cas des chiffres A-Z.

1

Je suggère d'utiliser PROC FCMP pour créer votre propre fonction de formatage. Ensuite, vous pouvez réutiliser le code quand vous le souhaitez:

proc fcmp outlib=sasuser.funcs.Radix36; 
    function Radix36(innumber) $ 32; /* returns character string, length 32 */ 
    number = innumber; 
    format base $32.; 
    alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 
    if number = 0 then base = '0'; 
    else do while (number ne 0); 
     mod = mod(number, length(alphabet)); 
     div = floor(number/(length(alphabet))); 
     base = cats(substr(alphabet,mod+1,1),base); 
     number = div; 
    end; 
    return (base); 
    endsub; 
run; 

/*****************************************************/ 
options cmplib=sasuser.funcs; /* add to search path */ 
data _null_; 
input innumber; 
base = Radix36(innumber); /* call function */ 
put innumber= base=; 
datalines; 
0 
100 
2000 
30000 
400000 
; 
run; 
Questions connexes