As of SAS release 9.4m3 it is possible to determine the "type" or category of a SAS column by using the FMTINFO function.
Examples
%let fmttype=%sysfunc(fmtinfo(DATE,cat)); returned value: date
%let fmttype=%sysfunc(fmtinfo(DATETIME20.2,cat)); returned value: UNKNOWN
%let fmttype=%sysfunc(fmtinfo(DATETIME,cat)); returned value: datetime
Why not just use the CAT type value from the FMTINFO() function?
%macro fmtcat(format);
%local i base;
%if %length(&format) %then %do;
%let i=%sysfunc(verify(%qsysfunc(reverse(&format)),.0123456789));
%if &i %then %let base=%sysfunc(substrn(&format,1,%length(&format)-&i+1));
%else %let base=F;
%sysfunc(fmtinfo(&base,cat))
%end;
%mend fmtcat;
Examples:
195 %put %fmtcat(datetime24.3); datetime 196 %put %fmtcat(time8.); time 197 %put %fmtcat(best); num 198 %put %fmtcat($char); char 199 %put %fmtcat(32.); num 200 %put %fmtcat(F); num 201 %put %fmtcat($); char 202 %put %fmtcat($10); char 203 %put %fmtcat($10.); char 204 %put %fmtcat(); 205 %put %fmtcat(xyz); UNKNOWN
Design question:
Why do you have two parameters posfmt and format= ?
%macro ut_fmt2type(posfmt,format=, lognote=N);
%local _this_fmt_type varfmt ;
/* allow positional and named parameter, prefer named parameter */
%let varfmt=%sysfunc(coalescec(&format.,&posfmt.));
It looks like this is a positional parameter and a keyword parameter for the same parameter, so that a user can call in either manner.
But even if you define a parameter as positional, a user is still free to call it as a keyword parameter, which is a really nice feature of the macro language. So I would think you could do this as:
%macro ut_fmt2type(format, lognote=N);
Why not just use the CAT type value from the FMTINFO() function?
%macro fmtcat(format);
%local i base;
%if %length(&format) %then %do;
%let i=%sysfunc(verify(%qsysfunc(reverse(&format)),.0123456789));
%if &i %then %let base=%sysfunc(substrn(&format,1,%length(&format)-&i+1));
%else %let base=F;
%sysfunc(fmtinfo(&base,cat))
%end;
%mend fmtcat;
Examples:
195 %put %fmtcat(datetime24.3); datetime 196 %put %fmtcat(time8.); time 197 %put %fmtcat(best); num 198 %put %fmtcat($char); char 199 %put %fmtcat(32.); num 200 %put %fmtcat(F); num 201 %put %fmtcat($); char 202 %put %fmtcat($10); char 203 %put %fmtcat($10.); char 204 %put %fmtcat(); 205 %put %fmtcat(xyz); UNKNOWN
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.