使用$ HEX格式,很容易通过SAS中的基数16将数字转换为字母数字值。现在我正在寻找一种简单的方法来完成基数36(10个数字和26个字母)。
示例:
在Java中,您可以通过Integer.toString(mynumber, 36)
执行此操作。有任何想法如何在SAS Base中做到这一点?
答案 0 :(得分:3)
不幸的是,有很简单的方法可以使用格式,但以下数据步骤应该可以解决问题。它仅适用于正整数。
data _null_;
infile cards;
input innumber;
number = innumber;
format base $32.;
alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
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;
答案 1 :(得分:1)
没有内置功能。您可以迭代地模拟36您的数字,然后除以36,直到剩下的数字为零。要转换模数序列,您必须添加48decimal或30hex以获取数字0-9和101decimal或65hex的ascii字符,以获得数字AZ的ascii字符。
答案 2 :(得分:1)
我建议使用PROC FCMP创建自己的格式化功能。然后,您可以随时重用代码:
proc fcmp outlib=sasuser.funcs.Radix36;
function Radix36(innumber) $ 32; /* returns character string, length 32 */
number = innumber;
format base $32.;
alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
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;