2011-03-10 61 views
5

使用$ HEX格式,很容易在SAS中基於基數16將數字轉換爲字母數字值。現在我正在尋找一個簡單的方法來做到這一點與36基數(10個數字& 26個字母)。將數字轉換爲基於基數的字母數字值36

實例:

  • 100 - > '2S'
  • 2000 - > '1JK'
  • 30000 - > 'n5c'
  • 400000 - > '8kn4'

在Java中,您可以通過Integer.toString(mynumber, 36)來完成此操作。任何想法如何在SAS Base中執行此操作?

回答

3

不幸的是,有一種簡單的方法可以使用格式來完成它,但下面的數據步驟應該可以解決這個問題。它僅適用於正整數。

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

看起來不錯!我已經知道Java中的算法,基數大於36,但我之前沒有看到SAS實現。謝謝! – TechnoCore 2011-03-10 14:58:39

1

這裏沒有內置的功能。你可以迭代模36你的數字,然後除以36,直到剩下的爲零。要轉換modulos序列,你必須添加48decimal或30hex來獲得ascii字符的情況下的數字0-9和101decimal或65hex獲得ascii字符的情況下的數字A - Z。

1

我建議使用PROC FCMP創建自己的函數來完成格式化。那麼你可以隨時重複使用代碼:

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;