Преобразовать числовое значение в буквенно-цифровое значение на основе радиуса 36 - PullRequest
5 голосов
/ 10 марта 2011

С помощью формата $ HEX легко преобразовать число в буквенно-цифровое значение на основе радиуса 16 в SAS.Теперь я ищу простой способ сделать это с основанием 36 (10 цифр и 26 букв).

Примеры:

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

В Java вы можете сделать это с помощью Integer.toString(mynumber, 36).Есть идеи, как это сделать в SAS Base?

Ответы [ 3 ]

3 голосов
/ 10 марта 2011

К сожалению, существует простой способ сделать это с использованием форматов, но следующий шаг данных должен решить проблему. Работает только для натуральных чисел.

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 голос
/ 17 марта 2011

Я предлагаю использовать 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;
1 голос
/ 10 марта 2011

Для этого нет встроенных функций.Вы можете итеративно по модулю 36 ваше число, а затем делить на 36, пока то, что остается, равен нулю.Чтобы преобразовать последовательность по модулю, которую вы получите, вы должны добавить 48 десятичных или 30-хекс, чтобы получить символ ascii в случае цифр 0-9 и 101-десятичный, или 65 гекс, чтобы получить символ ascii в случае цифр AZ.

...