Those tricky PERCENT formats

12

When using SAS to format a number as a percentage, there is a little trick that you need to remember: the width of the formatted value must include room for the decimal point, the percent sign, and the possibility of two parentheses that indicate negative values. The field width must include room for the parentheses even if the number that you are formatting is strictly positive!

The PERCENTw.d format

The PERCENTw.d format takes a proportion and displays it as a percentage. For example, 0.123 gets displayed as 12.3%. Negative values are displayed by enclosing them in parentheses, so -0.123 is displayed as (12.3%). Thus for proportions in the range (-1, 1), you need to allow at least six spaces: one each for the decimal point and percent sign, and two each for the number and the parentheses. This leads to the following heuristic:

For the PERCENTw.d format, the field width should be at least 6 more than the number of decimal places that you want to display.

In other words, for the PERCENTw.d format, a good rule of thumb is to set w = d + 6. Smaller field widths will either steal space from the decimal width or display the value as "*%", which means "unable to display this value by using the current field width."

My favorite formats are PERCENT7.1 and PERCENT8.2. An exception to the above heuristic is that I sometimes use PERCENT5.0 for variables that appear along the axis of a graph; you can use 5 for the field width because there is no decimal point to display. The following SAS DATA step displays several positive and negative proportions in the PERCENT7.1 and PERCENT8.2 formats:

data Percent;
format x BEST8. 
       p1 PERCENT7.1
       p2 PERCENT8.2;
label x = "Raw value"
      p1 = "PERCENT7.1"
      p2 = "PERCENT8.2";
input x @@;
p1 = x; 
p2 = x; 
datalines;
0.7543  0.0123 -0.0123 -0.7543
;
 
proc print data=Percent noobs label; run;
t_percent

If you have values that are greater than 1, you will need to increase the field width, since these will be displayed as 150% (1.5) or 2500% (25).

The PERCENTNw.d format

Not every SAS programmer knows about the PERCENTNw.d format. Notice the extra 'N' in the name, which stands for 'negative.' This format is similar to the PERCENTw.d format except that negative values are displayed by using a negative sign, rather than parentheses.

For many applications, I prefer the PERCENTNw.d format because of the way that it handles negative values. The heuristic for specifying the field width is the same as for the PERCENTw.d format. This might be surprise you. Since the PERCENTNw.d format uses a negative sign instead of parentheses, shouldn't you be able to specify a smaller field width?

No. For ease of converting between the PERCENTw.d and PERCENTNw.d formats, the rules are the same. The documentation for the PERCENTNw.d format states that "the width of the output field must account for the minus sign (–), the percent sign (%), and a trailing blank [emphasis added], whether the number is negative or positive."

You can modify the previous DATA step to display the same raw values by using the PERCENTNw.d format. The results follow:

t_percent2

In summary, remember to pad the field width for these formats by including space for the decimal point, the percent sign, and the possible negative sign or parentheses. You must do this even if your values are positive.

This blog post was inspired by an exchange on the SAS-L discussion forum. If you are new to Base SAS programming, The "L" is a good place to lurk-and-learn or to ask questions. I also recommend the SAS Support Communities for learning SAS software and related topics such as statistics, data mining, and matrix computations.

Share

About Author

Rick Wicklin

Distinguished Researcher in Computational Statistics

Rick Wicklin, PhD, is a distinguished researcher in computational statistics at SAS and is a principal developer of SAS/IML software. His areas of expertise include computational statistics, simulation, statistical graphics, and modern methods in statistical data analysis. Rick is author of the books Statistical Programming with SAS/IML Software and Simulating Data with SAS.

12 Comments

  1. Hi Rick.

    Great advice. The rule I use for PERCENTw.d is to add 3 to the desired numerical precision which must include a decimal point. In this way, I don't run into problems with percentage values exceeding 100 which do occur in some scenarios. For example, if I know that the possible range of percentage values is (500.00%) through 500.00%, I use PERCENT9.2, calculated as 6 positions for digits and decimal point, plus 3 positions for % sign and parentheses.

    Cheers,

    Peter

  2. I'm curious why SAS doesn't have a built in format for displaying percentages that are 100 based (so numbers from 0-100 displayed as "100%" etc... PROC FREQ and such give you percentage values that are 0-100 based in their datasets, not 0-1 based, and you have to use a custom format for them, annoyingly.

  3. I have not been able to get this to work. My code accepts 'percent6.', but not 'percentn7.' or 'percentn10.' I get the message 'ERROR 48-59: The informat PERCENTN was not found or could not be loaded.'.

  4. Why isn't there a PERCENTPN format that extends the idea of PERCENTN to positive values as well?

    I mean, a format that ALWAYS shows the sign before the number, like this for PERCENTPN10.2:
    +9.23%
    -2.43%

    as contrast to PERCENTN10.2:
    9.23%
    -2.43%

  5. Arcadio Matos on

    The issue that I have is that even if I use the format w.1 I still get 2 decimal places when I have a single digit percentage.

    • Rick Wicklin

      The examples in this blog post show that the PERCENT7.1 format displays one decimal place, not two. If you are having programming problems, you can post your data, code, and question at communities.sas.com.

  6. Hello Rick,
    I read this about 'percent' and 'percentn' formats (from 2015! some years ago) and... do you know if something like 'percentx' exists?
    Becasuse I'm trying to write a comma as decimal delimiter.

  7. Pingback: Using colors to visualize groups in a bar chart in SAS - The DO Loop

Leave A Reply

Back to Top