我先贴出我的做法:
<br />
%macro decimal_align(dataset=, var=);<br />
%let i=1;<br />
%do %until(%scan(&var,&i,%str( ))=%str());<br />
%global var&i;<br />
%let var&i=%scan(&var,&i,%str( ));<br />
data _n1;<br />
set &dataset(keep=&&var&i);<br />
if index(trim(left(&&var&i)),".")=0 then do;<br />
pre=length(trim(left(&&var&i)));<br />
post=-1;<br />
end;<br />
else do;<br />
pre=index(trim(left(&&var&i)),".")-1;<br />
post=length(trim(left(scan(&&var&i,2,'.'))));<br />
end;<br />
run;<br />
proc sql noprint;<br />
select max(pre), max(post)<br />
into: max_pre,<br />
: max_post<br />
from _n1;<br />
quit;<br />
<br />
data _n2;<br />
set _n1;<br />
if post=-1 then do;<br />
x=repeat(" ",(&max_pre-pre))||trim(left(&&var&i))||repeat(" ",(&max_post-post));<br />
end;<br />
else do;<br />
x=repeat(" ",(&max_pre-pre))||trim(left(scan(&&var&i,1,".")))||"."||trim(left(scan(&&var&i,2,".")))||repeat(" ",(&max_post-post));<br />
end;<br />
keep x;<br />
run;<br />
data &dataset;<br />
merge &dataset _n2(rename=(x=&&var&i));<br />
run;<br />
%let i=%eval(&i+1);<br />
%end;<br />
%mend;<br />