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
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
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.