根据基数36将数字转换为字母数字值

时间:2011-03-10 12:27:23

标签: sas

使用$ HEX格式,很容易通过SAS中的基数16将数字转换为字母数字值。现在我正在寻找一种简单的方法来完成基数36(10个数字和26个字母)。

示例:

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

在Java中,您可以通过Integer.toString(mynumber, 36)执行此操作。有任何想法如何在SAS Base中做到这一点?

3 个答案:

答案 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;