FORMAT Procedure

PICTURE Statement

Creates a template for printing numbers.
Restriction: National language format directives can be used in the PICTURE statement only under DBCS and UTF-8 environments.
Tips: As a best practice, if you specify an existing format in a value-range-set, always specify a default value by using the DEFAULT= option.

If you are formatting DBCS characters, use the DEFAULT= option to set the default format width to be large enough to format these characters. Without setting the DEFAULT= option, the default width of a format is the width of the largest value to the right of the equation symbol.

See: SAS Formats and Informats: Reference and SAS National Language Support (NLS): Reference Guide for documentation about formats that are supplied by SAS.
Creating a Picture Format

Filling a Picture Format

Creating a Format in a non-English Language

Syntax

PICTURE name <(format-option(s))>
<value-range-set-1 <(picture-1-option(s) )> >
<...value-range-set-n <(picture-n-option(s))>>;

Summary of Optional Arguments

Control the attributes of each picture in the format
enables the use of directives in the picture as a template to format date, time, or datetime values.
specifies the separator character for the fractional part of a number.
specifies the three-digit separator character for a number.
specifies a character that completes the formatted value.
specifies the language that is used for weekdays and months year that you can substitute in a date, time, or datetime picture.
specifies a number to multiply the variable's value by before it is formatted.
specifies that numbers are message characters rather than digit selectors.
specifies a character prefix to place in front of the formatted value.
Control the attributes of the format
specifies the default length of the picture.
specifies a fuzz factor for matching values to a range.
specifies a maximum length for the format.
specifies a minimum length for the format.
enables the assignment of labels to multiple values-or-range values that might have the same or overlapping values.
stores values or ranges in the order in which you define them.
rounds the value to the nearest integer before formatting.
Control the template for printing
specifies one or more variable values and a template for printing those values.

Required Argument

name
names the format that you are creating.
Restriction:A user-defined format cannot be the name of a format supplied by SAS.
Requirement:The name must be a valid SAS name. A numeric format name can be up to 32 characters in length; a character format name can be up to 31 characters in length, not ending in a number. If you are creating a character format, you use a dollar sign ($) as the first character, which is why a character informat is limited to 31 characters. For information about SAS names, see Rules for Words and Names in the SAS Language in SAS Language Reference: Concepts.
Interaction:The maximum length of a format name is controlled by the VALIDFMTNAME= system option. See SAS System Options: Reference for details.
Tip:Refer to the format later by using the name followed by a period. However, do not put a period after the format name in the VALUE statement.

Optional Arguments

DATATYPE=DATE | TIME | DATETIME
enables the use of directives in the picture as a template to format date, time, or datetime values. Specify either DATE, TIME, or DATETIME based on the directive that you use in the picture format. See the definition and list of directives in the description of picture.
Tip:If you format a numeric missing value, then the resulting label will be ERROR. Adding a clause to your program that checks for missing values can eliminate the ERROR label.
DEFAULT=length
specifies the default length of the picture. The value for DEFAULT= becomes the length of picture if you do not give a specific length when you associate the format with a variable.
The default length of a picture is the length of the longest picture value.
Tip:If you are formatting DBCS characters, use the DEFAULT= option to set the default format width large enough to format these characters.
DECSEP='character'
specifies the separator character for the fractional part of a number.
Default:. (a decimal point)
DIG3SEP='character'
specifies the three-digit separator character for a number.
Default:, (a comma)
FILL='character'
If the number of significant digits is less than the length of the format, then the format must complete, or fill, the formatted value:
  • The format uses character to fill the formatted value if you specify zeros as digit selectors.
  • The format uses zeros to fill the formatted value if you specify nonzero digit selectors. The FILL= option has no effect.
If the picture includes other characters, such as a comma, which appear to the left of the digit selector that maps to the last significant digit placed, then the characters are replaced by the fill character or leading zeros.
Default:' ' (a blank)
Interaction:If you use the FILL= and PREFIX= options in the same picture, then the format places the prefix and then the fill characters.
FUZZ=fuzz-factor
specifies a fuzz factor for matching values to a range. If a number does not match or fall in a range exactly but comes within fuzz-factor, then the format considers it a match. For example, the following VALUE statement creates the LEVELS. format, which uses a fuzz factor of .2:
value levels (fuzz=.2) 1='A'
                       2='B'
                       3='C';
FUZZ=.2 means that if a variable value falls within .2 of a value on either end of the range, then the format uses the corresponding formatted value to print the variable value. So the LEVELS. format formats the value 2.1 as B.
If a variable value matches one value or range without the fuzz factor, and also matches another value or range with the fuzz factor, then the format assigns the variable value to the value or range that it matched without the fuzz factor.
Default:1E−12 for numeric formats.
Tip:Specify FUZZ=0 to save storage space when you use the VALUE statement to create numeric formats.
LANGUAGE=
specifies the language that is used for weekdays and months year that you can substitute in a date, time, or datetime picture. If you specify a language that is not supported or is invalid, English is used.
Valid values for LANGUAGE= are the same languages that you can specify for the DFLANG= system option:
Afrikaans English Macedonian Spanish
Catalan Finnish Norwegian Swedish
Croatian French Polish Swiss_French
Czech German Portuguese Swiss_German
Danish Hungarian Russian
Dutch Italian Slovenian
Default:English
Tip:To use a user-defined format in languages other than those that are supported by the LANGUAGE= option, set the LOCALE= system option to the locale for the language. In PROC FORMAT, do not specify the LANGUAGE= option. The language of a picture format is determined by the locale setting. For a list of locales, see LOCALE= Values and Default Settings for ENCODING, PAPERSIZE, DFLANG, and DATESTYLE Options in SAS National Language Support (NLS): Reference Guide.
See:DFLANG= System Option: UNIX, Windows, and z/OS in SAS National Language Support (NLS): Reference Guide
MAX=length
specifies a maximum length for the format. When you associate the format with a variable, you cannot specify a width greater than the MAX= value.
Default:40
Range:1–40
MIN=length
specifies a minimum length for the format.
Default:1
Range:1–40
MULTILABEL
The label is the formatted value that is determined by the picture definition on the right of the equal sign in a value-range-set. Here is an example of how MULTILABEL is used:
The following PICTURE statements show the two uses of the MULTILABEL option. In each case, number formats are assigned as labels. The first PICTURE statement assigns multiple labels to a single value. Multiple labels can also be assigned to a single range of values. The second PICTURE statement assigns labels to overlapping ranges of values. The MULTILABEL option enables the assignment of multiple labels to the overlapped values.
picture abc (multilabel)
    1000='9,999'
    1000='9999';

  picture overlap (multilabel)
    /* without decimals */
    0-999='999'
    1000-9999='9,999'

     /* with decimals */
    0-9='9.999'
    10-99='99.99'
    100-999='999.9';
Only multilabel-enabled procedures such as PROC MEANS, PROC SUMMARY, and PROC TABULATE can use multiple labels. All other procedures and the DATA step recognize only the primary label.
The primary label for a given entry is the formatted value (based on the picture) that is assigned to the first value or range-of-values (left side of the equal sign) that matches or contains the entry when all values (on the left side of the equal sign) are ordered sequentially. Here is an example:
  • In the first PICTURE statement, the primary label for 1000 is 1,000 because the picture 9,999 is the first value that is assigned to 1000. The secondary label for 1000 is 1000, based on the 9999 picture.
  • In the second PICTURE statement, the primary label for 5 is 5.000 based on the 9.999 picture that is assigned to the range 0–9 because 0–9 is sequentially the first range of values that contain 5. The secondary label for 5 is 005 because the range 0–999 occurs in sequence after the range 0–9.
Consider carefully when you assign multiple labels to a value.
Unless you use the NOTSORTED option when you assign variables, SAS stores the variables in sorted order. This order can produce unexpected results when variables with the MULTILABEL format are processed. Here is an example:
In the second PICTURE statement, the primary label for 15 is 015, and the secondary label for 15 is 15.00 because the range 0–999 occurs in sequence before the range 10–99. If you want the primary label for 15 to use the 99.99 format, then you might want to change the range 10–99 to 0–99 in the PICTURE statement. The range 0–99 occurs in sequence before the range 0–999 and will produce the desired result.
Restriction:The maximum number of labels that can be created for a single format or informat is 255.
MULTIPLIER=n
specifies a number to multiply the variable's value by before it is formatted. The value of the MULTIPLIER= option depends both on the result of the multiplication and on the digit selectors in the picture portion of the value-range-set. For example, the following PICTURE statement creates the MILLION. format, which formats the variable value 1600000 as $1.6M:
picture million low-high='09.9M'
        (prefix='$' mult=.00001);
1600000 is first multiplied by .00001, which equals 16. Note that there is a digit selector after the decimal. The value 16 is placed into the picture beginning on the right. The value 16 overlays 09.9, and results in 01.6. Leading zeros are dropped, and the final result is 1.6M.
If the value of low-high is equal to '000M', then the result would be 16M.
Alias:MULT=
Default:10n, where n is the number of digits after the first decimal point in the picture. For example, suppose your data contains a value 123.456 and you want to print it using a picture of '999.999'. The format multiplies 123.456 by 103 to obtain a value of 123456, which results in a formatted value of 123.456.
NOEDIT
specifies that numbers are message characters rather than digit selectors. That is, the format prints the numbers as they appear in the picture. For example, the following PICTURE statement creates the MILES. format, which formats any variable value greater than 1000 as >1000 miles:
picture miles 1-1000='0000'
           1000<-high='>1000 miles'(noedit);
NOTSORTED
stores values or ranges in the order in which you define them. If you do not specify NOTSORTED, then values or ranges are stored in sorted order by default, and SAS uses a binary searching algorithm to locate the range that a particular value falls into. If you specify NOTSORTED, then SAS searches each range in the order in which you define them until a match is found.
Use NOTSORTED if one of the following is true:
  • You know the likelihood of certain ranges occurring, and you want your format to search those ranges first to save processing time.
  • You want to preserve the order that you define ranges when you print a description of the format using the FMTLIB option.
  • You want to preserve the order that you define ranges when you use the ORDER=DATA option and the PRELOADFMT option to analyze class variables in PROC MEANS, PROC SUMMARY, or PROC TABULATE.
Do not use NOTSORTED if the distribution of values is uniform or unknown, or if the number of values is relatively small. The binary searching algorithm that SAS uses when NOTSORTED is not specified optimizes the performance of the search under these conditions.
SAS automatically sets the NOTSORTED option when you use the CPORT and the CIMPORT procedures to transport informats or formats between operating environments with different standard collating sequences. This automatic setting of NOTSORTED can occur when you transport informats or formats between ASCII and EBCDIC operating environments. If this situation is undesirable, then do the following:
  • Use the CNTLOUT= option in the PROC FORMAT statement to create an output control data set.
  • Use the CPORT procedure to create a transport file for the control data set.
  • Use the CIMPORT procedure in the target operating environment to import the transport file.
  • In the target operating environment, use PROC FORMAT with the CNTLIN= option to build the formats and informats from the imported control data set.
PREFIX='prefix'
specifies a character prefix to place in front of the formatted value. The prefix is placed in front of the value's first significant digit. You must use zero digit selectors or the prefix is not used.
Typical uses for PREFIX= are printing leading currency symbols and minus signs. For example, the PAY. format prints the variable value 25500 as $25,500.00:
picture pay
   low-high='000,009.99' (prefix='$');
Default:no prefix
Interaction:If you use the FILL= and PREFIX= options in the same picture, then the format places the prefix and then the fill characters.
CAUTION:
If the picture is not wide enough to contain both the value and the prefix, then the format truncates or omits the prefix, which results in inaccurate data.
ROUND
rounds the value to the nearest integer before formatting. Without the ROUND option, the format multiplies the variable value by the multiplier, truncates the decimal portion (if any), and prints the result according to the template that you define. With the ROUND option, the format multiplies the variable value by the multiplier, rounds that result to the nearest integer, and then formats the value according to the template. Note that if the FUZZ= option is also specified, the rounding takes place after SAS has used the fuzz factor to determine which range the value belongs to.
Tip:The ROUND option rounds a value of .5 to the next highest integer.
CAUTION:
The picture must be wide enough for an additional digit if rounding a number adds a digit to the number.
For example, the picture for the number .996 could be ‘99’ (prefix ‘.’ mult=100). After rounding the number and multiplying it by 100, the resulting number is 100. When the picture is applied, the result is .00, an inaccurate number. In order to ensure accuracy of numbers when you round numbers, make the picture wide enough to accommodate larger numbers.
value-range-set
specifies one or more variable values and a template for printing those values. value-range-set has the following form:
value-or-range-1 <..., value-or-range-n>='picture'
picture
specifies a template for formatting values of numeric variables. The picture is a sequence of characters in single quotation marks. The maximum length for a picture is 40 characters. Pictures are specified with three types of characters: digit selectors, message characters, and directives. You can have a maximum of 16 digit selectors in a picture.
digit selectors
are numeric characters (0 through 9) that define positions for numeric values. A picture format with nonzero digit selectors prints any leading zeros in variable values; picture digit selectors of 0 do not print leading zeros in variable values. If the picture format contains digit selectors, then a digit selector must be the first character in the picture.
Note:This section uses 9's as nonzero digit selectors.
message characters
are nonnumeric characters that print as specified in the picture. The following PICTURE statement contains both digit selectors (99) and message characters (illegal day value). Because the DAYS. format has nonzero digit selectors, values are printed with leading zeros. The special range OTHER prints the message characters for any values that do not fall into the specified range (1 through 31).
picture days 
           01-31='99'
           other='99-illegal day value';
Example:The values 02 and 67 print as
                             02
       67-illegal day value
directives
are special characters that you can use in the picture to format date, time, or datetime values.
Note: You can use directives only when you specify the DATATYPE= option in the PICTURE statement. Ensure that the value of the DATATYPE= option is appropriate for the type of directive that you want to use. If you use an inappropriate value, the data does not format. For example, for the %a directive, use DATATYPE=DATE.
The permitted directives are as follows:
%a
abbreviated weekday name (for example, Wed).
Interaction:This directive can be used for all formats, including national language formats.
%A
full weekday name (for example, Wednesday).
Interaction:This directive can be used for all formats, including national language formats.
%b
abbreviated month name (for example, Jan).
Interaction:This directive can be used for all formats, including national language formats.
%B
full month name (for example, January).
Interaction:This directive can be used for all formats, including national language formats.
%C
long month name with blank padding (January through December) (for example, December).
Interaction:This directive can be used only for national language formats.
%d
day of the month.
Interaction:This directive can be used for all formats, including national language formats.
Note:To add a leading zero before a single-digit number, insert a 0 before the directive (for example, %0d).
%e
day of the month as a two-character decimal number with leading spaces (" 1"- "31") (for example, “ 2”).
Interaction:This directive can be used only for national language formats.
%F
full weekday name with blank padding.
Interaction:This directive can be used only for national language formats.
%G
year as a four-digit decimal number (for example, 2008). If the week that contains January 1 has four or more days in the new year, then it is considered week 1 in the new year. Otherwise, it is the last week of the previous year and the year is considered the previous year.
Interaction:This directive can be used only for national language formats.
%H
hour (24-hour clock).
Interaction:This directive can be used for all formats, including national language formats.
Note:To add a leading zero before a single-digit number, insert a 0 before the directive (for example, %0H).
%I
hour (12-hour clock).
Interaction:This directive can be used for all formats, including national language formats.
Note:To add a leading zero before a single-digit number, insert a 0 before the directive (for example, %0I).
%j
day of the year as a decimal number (1–366), with leading zero.
Interaction:This directive can be used for all formats, including national language formats.
Note:To add a leading zero before a single-digit number, insert a 0 before the directive (for example, %0j).
%m
month (1–12).
Interaction:This directive can be used for all formats, including national language formats.
Note:To add a leading zero before a single-digit number, insert a 0 before the directive (for example, %0m).
%M
minute (0–59).
Interaction:This directive can be used for all formats, including national language formats.
Note:To add a leading zero before a single-digit number, insert a 0 before the directive (for example, %0M).
%n
number of days in a duration as a decimal number (maximum of 10 digits) (for example, 25).
Interaction:This directive is not valid for national languages.
%o
month (1-12) with blank padding (for example, " 2").
Interaction:This directive can be used only for national language formats.
%p
equivalent to either a.m. or p.m.
Interaction:This directive can be used for all formats, including national language formats.
%q
abbreviated quarter of the year string such as 1, 2, 3, or 4.
Interaction:This directive can be used for all formats, including national language formats.
%Q
quarter of the year string, such as Quarter1, Quarter2, Quarter3, or Quarter4.
Interaction:This directive can be used only for national language formats.
%s
fractional seconds as decimal digits (for example, .39555). The number of digits formatted is the number of digits to the right of the decimal point that is specified when you use the format. SAS rounds fractional seconds to accommodate the number of digits specified for fractional seconds.
Interaction:This directive is not valid for national languages.
%S
seconds (0–59), allowing for possible leap seconds.
Interaction:This directive can be used for all formats, including national language formats.
Note:To add a leading zero before a single-digit number, insert a 0 before the directive (for example, %0S).
Example:58 and 59.07
%u
weekday as a one-digit decimal number (1–7 (Monday - Sunday)) (for example, Sunday=7).
Interaction:This directive can be used only for national language formats.
%U
week number of the year as a decimal number (0–53). Sunday is considered the first day of the week.
Interaction:This directive can be used for all formats, including national language formats.
Note:To add a leading zero before a single-digit number, insert a 0 before the directive (for example, %0U).
%V
week number (01–53) with the first Monday as the start day of the first week. Minimum days of the first week is 4.
Interaction:This directive can be used only for national language formats.
Note:To add a leading zero before a single-digit number, insert a 0 before the directive (for example, %0SV).
%w
weekday as a one-digit decimal number (0–6 (Sunday through Saturday)) (for example, Sunday=0).
Interaction:This directive can be used for all formats, including national language formats.
Note:To add a leading zero before a single-digit number, insert a 0 before the directive (for example, %0w).
%W
week number (0–53) with the first Monday as the start day of the first week.
Interaction:This directive can be used only for national language formats.
Note:To add a leading zero before a single-digit number, insert a 0 before the directive (for example, %0W).
%y
year without century (0–99) (for example, 93).
Interaction:This directive can be used for all formats, including national language formats.
Note:To add a leading zero before a single-digit number, insert a 0 before the directive (for example, %0y).
%Y
year with century as a four-digit decimal number (1970–2069) (for example, 1994).
Interaction:This directive can be used for all formats, including national language formats.
%z
UTC time-zone offset.
Interaction:This directive can be used only for national language formats.
%Z
time-zone name.
Interaction:This directive can be used only for national language formats.
%%
the % character.
Tip:Add code to your program to direct how you want missing values to be displayed.
value-or-range
Interaction:If you specify LANGUAGE= and PICTURE= in the format definition, the format supports only English and the European languages. To use a user-defined format in languages other than those that are supported by the LANGUAGE= option, use the PICTURE= statement. Do not specify the LANGUAGE= option. The language of a picture format is determined by the locale setting.

Details

Building a Picture Format: Step by Step

This section shows how to write a picture format for formatting numbers with leading zeros. In the SAMPLE data set, the default printing of the variable Amount has leading zeros on numbers between 1 and −1:
data sample;
   format Amount nozeros.;
   input Amount;
   datalines;
-2.051
-.05
-.017
  0
.093
.54
.556
6.6
14.63
0.996
-0.999
-45.00
;
run;

proc print data=sample;
   title 'Default Printing of the Variable Amount';
run;
The Sample Data Set
The following PROC FORMAT step uses the ROUND format option and creates the NOZEROS. format, which eliminates leading zeros in the formatted values:
libname library 'SAS-library';
proc format;
   picture nozeros (round)
     low -  -1      =  '000.00' (prefix='-')
     -1 < - < -.99  =  '9.99'  (prefix='-' mult=100)
     -0.99 <-<  0   =  '99'    (prefix='-.' mult=100)
                0   =  '9.99'
      0 <  -< .99   =  '99'    (prefix='.' mult=100)
      0.99 - < 1    =  '9.99'  (mult=100)
      1  - high     =  '09.99';
run;

The following table explains how one value from each range is formatted. For an illustration of each step, see Steps to Format Various Values.
Building a Picture Format
Step
Rule
In This Example
1
Determine into which range the value falls and use that picture.
In the second range, the exclusion operator < appears on both sides of the hyphen and excludes −1 and -.99 from the range.
2
Take the absolute value of the numeric value.
Because the absolute value is used, you need a separate range and picture for the negative numbers in order to prefix the minus sign.
3
Multiply the number by the MULT= value. If you do not specify the MULT= option, then the PICTURE statement uses the default. The default is 10n, where n is the number of digit selectors to the right of the decimal 1 in the picture. (Step 6 discusses digit selectors further.)
Specifying a MULT= value is necessary for numbers between 0 and 1 and numbers between 0 and −1 because no decimal appears in the pictures for those ranges. Because MULT= defaults to 1, truncation of the significant digits results without a MULT= value specified. (Truncation is explained in the next step.) For the three ranges that do not have MULT= values specified, the MULT= value defaults to 100 because the corresponding picture has two digit selectors to the right of the decimal. After the MULT= value is applied, all significant digits are moved to the left of the decimal.
4
Add a fuzz factor of 10e-8 to the number. If the ROUND option is not in effect, truncate the number after the decimal. If the ROUND option is in effect, then the format rounds the number after the decimal to the next highest integer if the number after the decimal is greater than or equal to .5.
Note: The fuzzing factor is not related to the FUZZ= option. The FUZZ= option is used in matching ranges to values.
Because the example uses MULT= values that ensured that all of the significant digits were moved to the left of the decimal, no significant digits are lost. The zeros are truncated.
5
Turn the number into a character string. If the number is shorter than the picture, then the length of the character string is equal to the number of digit selectors in the picture. Pad the character string with leading zeros. (The results are equivalent to using the Zw. format. Zw. is explained in the section on SAS formats in SAS Formats and Informats: Reference.
The numbers 205, 5, and 660 become the character strings 0205, 005, and 0660, respectively. Because each picture is longer than the numbers, the format adds a leading zero to each value. The format does not add leading zeros to the number 56 because the corresponding picture has only two digit selectors.
6
Apply the character string to the picture. The format only maps the rightmost n characters in the character string, where n is the number of digit selectors in the picture. Thus, it is important to make sure that the picture has enough digit selectors to accommodate the characters in the string.
After the format takes the right-most n characters, it then maps those characters to the picture from left to right. Choosing a zero or nonzero digit selector is important if the character string contains leading zeros. If one of the leading zeros in the character string maps to a nonzero digit selector, then it and all subsequent leading zeros become part of the formatted value. If all of the leading zeros map to zero digit selectors, then none of the leading zeros become part of the formatted value. The format replaces the leading zeros in the character string with blanks. 2
The leading zero is dropped from each of the character strings 0205 and 0660 because the leading zero maps to a zero digit selector in the picture.
7
Prefix any characters that are specified in the PREFIX= option. You need the PREFIX= option because when a picture contains any digit selectors, the picture must begin with a digit selector. Thus, you cannot begin your picture with a decimal point, minus sign, or any other character that is not a digit selector.
The PREFIX= option reclaims the decimal point and the negative sign, as shown with the formatted values -.05 and .55.
1A decimal in a PREFIX= option is not part of the picture.
2You can use the FILL= option to specify a character other than a blank to become part of the formatted value.
Steps to Format Various Values
Step
Action
-2.051
-.05
.556
.996
6.6
1.
Range
low - -1
-0.99 < - <0
0 < - < .99
0.99 - <1
1 - high
2.
Picture
000.00
99
99
9.99
09.99
3.
Absolute value
2.051
.05
.556
.996
6.6
4.
MULT=
2.051x102=205.1
.05x100=5
.556x100=55.600
.996x100=99.6
6.6x102=660
5.
Round
205
5
56
100
660
6.
Character string
0205
05
56
100
0660
7.
Template
2.05
05
56
1.00
6.60
8.
Prefix
prefix='-'
prefix='-.'
prefix='.'
none
none
Formatted result
-2.05
-.05
.56
1.00
6.60
The following PROC PRINT step associates the NOZEROS. format with the AMOUNT variable in SAMPLE. The output shows the result of rounding.
proc print data=sample noobs;
   format amount nozeros.;
   title 'Formatting the Variable Amount';
   title2 'with the NOZEROS. Format';
run;
Formatting the Variable Amount with the NOZEROS. Format
CAUTION:
The picture must be wide enough for the prefix and the numbers.
In this example, if the value -45.00 were formatted with NOZEROS., then the result would be 45.00 because it falls into the first range, low - -1, and the picture for that range is not wide enough to accommodate the prefixed minus sign and the number.
CAUTION:
The picture must be wide enough for an additional digit if rounding a number adds a digit to the number.
For example, the picture for the number .996 could be ‘99’ (prefix ‘.’ mult=100). After rounding the number and multiplying it by 100, the resulting number is 100. When the picture is applied, the result is .00, an inaccurate number. In order to ensure accuracy of numbers when you round numbers, make the picture wide enough to accommodate larger numbers.

Specifying No Picture

This PICTURE statement creates a picture-name format that has no picture:
picture picture-name;
Using this format has the effect of applying the default SAS format to the values.