2011-03-10 46 views
5

Es fácil transformar un número en un valor alfanumérico basado en radix 16 en SAS utilizando el formato $ HEX. Ahora estoy buscando una manera fácil de hacer esto con radix 36 (10 números & 26 letras).Convierta el valor numérico en un valor alfanumérico basado en radix 36

Ejemplos:

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

En Java puede hacer esto por Integer.toString(mynumber, 36). ¿Alguna idea de cómo hacer esto en SAS Base?

Respuesta

3

Lamentablemente, hay una manera fácil de hacerlo, pero el siguiente paso de datos debería resolver el problema. Funciona solo para enteros positivos.

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

Se ve bien! Ya conocía el algoritmo en Java para radix> 36 pero no vi la implementación de SAS antes. ¡Gracias! – TechnoCore

1

No hay funcionalidad incorporada para esto. Puedes iterar 36 veces tu número, luego dividir por 36 hasta que lo que queda sea cero. Para convertir la secuencia de modulos que obtienes tienes que agregar 48decimal o 30hex para obtener el ascii-character en el caso de los dígitos 0-9 y 101decimal o 65hex para obtener el ascii-character en el caso de los dígitos A-Z.

1

Sugiero usar PROC FCMP para crear su propia función que hace el formateo. A continuación, puede reutilizar el código siempre que lo desee:

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; 
Cuestiones relacionadas