BookmarkSubscribeRSS Feed
Ujjawal
Quartz | Level 8

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?

6 REPLIES 6
Astounding
PROC Star

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?

Ujjawal
Quartz | Level 8

%let x = 20 abc 50 A1;

 

 It should return 2 since two values are numeric.

 

Astounding
PROC Star

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.

Ksharp
Super User

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;
FreelanceReinh
Jade | Level 19

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( ))
ballardw
Super User

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.

CFC_SAS_Communities_400x225.jpg

Call for content now open!

It's your turn to help shape SAS Innovate 2027. Share your expertise and inspire the SAS community.

Submit your proposal →

How to Concatenate Values

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 6 replies
  • 5074 views
  • 3 likes
  • 5 in conversation