Return to Archive SAS Tip of the Month August 2008 Transferring a numeric variable to a character value is a common task, a lot more common than people realize – infact most people do not realize they are doing it. Take for example the following code that is inside a datastep: ``` if hours>40 then flagtxt='NOTE: Hours reported are greater than 40 – reported '|| 'hours are: '||compress(put(hours,8.2.));``` In the example we are placing the HOURS value that is stored as numeric to a character string. If we had just done: ``` if hours>40 then flagtxt='NOTE: Hours reported are greater than 40 – reported '|| 'hours are: ‘||hours;``` SAS would have brought up a message in the SAS LOG indicating that a numeric to character conversion had been done within SAS – these messages should be looked at. In the above example, the conversion is easy to spot, but not something like: ` Tothours = tothours + hours;` where the variable HOURS is numeric and TOTHOURS is character – here some very funny things can go on and unexpected results occur. Let me show you now a classic example that I show people regarding this issue: ``` 191 data _null_; 192 length x \$8; 193 x = 1/3; 194 x = x * 3; 195 put x=; 196 run; NOTE: Numeric values have been converted to character values at the places given by: (Line):(Column). 193:9 194:10 NOTE: Character values have been converted to numeric values at the places given by: (Line):(Column). 194:8 x=0.999999``` The answer for x should of course be 1, not 0.999999 – what the program first did was calculate 1/3 and stored it as a character, then multiplied that value by 3. I did not copy across the LOG messages but it said that “NOTE: Numeric values have been converted to character values at the places given by …” To avoid the issues of numeric to character conversion, please always use a PUT statement with a format to put the correct numeric value into a character variable. Next month, Character to Numeric conversion. ________________________________ Updated August 1, 2008