Если вы хотите преобразовать значения, такие как примеры 65-003
и 65-003
, в 65-3
, то ваша программа слишком сложна.Вы можете просто преобразовать вторую часть в число, а затем сгенерировать строку.Или вы могли бы использовать регулярные выражения для преобразования дефисов, за которыми следуют один или несколько нулей, в просто дефис.
Вот решение кода шага данных для обоих методов:
data test;
input have $20. ;
length want1-want2 $20;
want1=catx('-',scan(have,1,'-'),input(scan(have,2,'-'),32.));
want2=prxchange('s/-0*/-/',-1,have);
cards;
65-003
65-0003
;
Или вы можете сделать что-топохоже на код макроса для работы со значением макропеременной.Функция %eval()
оценивает строки, которые выглядят как выражения, используя целочисленную арифметику, поэтому добавление +
делает 003
похожим на выражение для оценки.
%macro fix1(string);
%scan(&string,1,-)-%eval(+%scan(&string,2,-))
%mend fix1;
%macro fix2(string);
%sysfunc(prxchange(s/-0*/-/,-1,%superq(string)))
%mend fix2;
%put %fix1(65-003);