使用$ HEX格式,很容易在SAS中基於基數16將數字轉換爲字母數字值。現在我正在尋找一個簡單的方法來做到這一點與36基數(10個數字& 26個字母)。將數字轉換爲基於基數的字母數字值36
實例:
- 100 - > '2S'
- 2000 - > '1JK'
- 30000 - > 'n5c'
- 400000 - > '8kn4'
在Java中,您可以通過Integer.toString(mynumber, 36)
來完成此操作。任何想法如何在SAS Base中執行此操作?
使用$ HEX格式,很容易在SAS中基於基數16將數字轉換爲字母數字值。現在我正在尋找一個簡單的方法來做到這一點與36基數(10個數字& 26個字母)。將數字轉換爲基於基數的字母數字值36
實例:
在Java中,您可以通過Integer.toString(mynumber, 36)
來完成此操作。任何想法如何在SAS Base中執行此操作?
不幸的是,有一種簡單的方法可以使用格式來完成它,但下面的數據步驟應該可以解決這個問題。它僅適用於正整數。
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;
這裏沒有內置的功能。你可以迭代模36你的數字,然後除以36,直到剩下的爲零。要轉換modulos序列,你必須添加48decimal或30hex來獲得ascii字符的情況下的數字0-9和101decimal或65hex獲得ascii字符的情況下的數字A - Z。
我建議使用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;
看起來不錯!我已經知道Java中的算法,基數大於36,但我之前沒有看到SAS實現。謝謝! – TechnoCore 2011-03-10 14:58:39