I am trying to calculate the number of numeric values in a macro parameter.
The code below works for character strings-
%let x = A B C;
%let n = %SYSFUNC(COUNTW(&x));
The code below does not work for numeric values-
%let x = 10 20 50;
%let n = %SYSFUNC(COUNT(&x));
I know COUNT does not work like this. Which function i can use to solve it?
For your example, you can still use COUNTW.
Do you have more complex situations, such as:
%let x = 20 abc 50 A1;
If so, what would you like the result to be?
%let x = 20 abc 50 A1;
It should return 2 since two values are numeric.
Counting numeric vs. character separately is much harder.
But COUNTW will work with a list of numeric values. There must be some other problem. You can always post the code that gives you a blank.
How about this :
%macro count_digit(t=);
%local temp count;
%let count=0;
%do i=1 %to %sysfunc(countw(&t));
%let temp=%scan(&t,&i);
%if %datatyp(&temp)=NUMERIC %then %do;
%let count=%eval(&count+1);
%end;
%end;
&count
%mend;
%let x = 20 abc 50 A1;
%let n = %count_digit(t=&x);
%put &n;
Great suggestion from @Ksharp (as always). The %DATATYP autocall macro would even recognize leading plus or minus signs, decimal points or scientific notation (...E-6) as valid parts of numeric values. If this more general type of numeric "words" could occur, however, the sets of delimiters used by both COUNTW and %SCAN should be restricted (e.g. reduced to blanks, as shown below), as otherwise plus and minus signs and decimal points would be regarded as delimiters:
countw(&t,%str( ))
%scan(&t,&i,%str( ))
Probably misunderstanding how COUNT works. Count counts the number of times a substring appears in a string.
Count("xyxzxb 123","x") would return 3 times that X appears in the string.
%let x= 1,2,3;
%let count=%sysfunc(n(x)); would give you count but the list would have to be comma separated which in general is a suboptimal choice with macro variables and fails miserably if any nonnumeric noncomma characters are encountered.
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.