Formatting SAS:输出四舍五入到小数点后一位的数值,除非是整数

Formatting SAS:输出四舍五入到小数点后一位的数值,除非是整数,formatting,sas,report,Formatting,Sas,Report,我需要取一个像18.433333333这样的值,并将其输出为18.4。同时,我需要像5这样的值作为5输出 我该怎么做 我所有的数字都在[01100]的范围内。因此,4的宽度似乎是合适的。每个数字字符三个,小数一个。最好的格式选择是BESTDw.p或w.d 如果我使用BESTD4.1,则5是5,但18.433333333是18 如果我使用4.1,则18.433333333是18.4,但5是5.00 这将出现在PROC报告的上下文中 data example; input ID $

我需要取一个像
18.433333333
这样的值,并将其输出为
18.4
。同时,我需要像
5
这样的值作为
5
输出

我该怎么做

我所有的数字都在[01100]的范围内。因此,4的宽度似乎是合适的。每个数字字符三个,小数一个。最好的格式选择是
BESTDw.p
w.d

如果我使用
BESTD4.1
,则
5
5
,但
18.433333333
18

如果我使用
4.1
,则
18.433333333
18.4
,但
5
5.00

这将出现在PROC报告的上下文中

data example;
  input 
    ID $ 
    wd 
    bestdwp
    ;

  datalines;
  1 18.433333333 18.433333333
  2 5 5
  ;
run;

proc report data = example;
  column  
    ID
    wd
    bestdwp
    ;

  define ID      / 'ID';
  define wd      / 'w.d'       format = 4.1;
  define bestdwp / 'BESTDw.p'  format = bestd4.1;
run;
然后输出为:

                                           BEST
                           ID         w.d  Dw.p
                           1         18.4    18
                           2          5.0     5

使用
BEST4.1
代替
BESTD4.1

从文件中

整数是不带小数的

带小数的数字根据需要或宽度允许,在小数点的左右两侧写尽可能多的数字


您可以使用自定义图片格式执行此操作。我不确定是否有更简单的方法,除了在将数值变量传递到
proc report
之前将其转换为文本之外:

proc format;
picture mixed
  %macro loop;
    %do i = 0 %to 99;
      &i = '99'
      &i <-< %eval(&i+1) = '99.9'
    %end;
  %mend;
  %loop;
run;

data _null_;
  do i = 18.33, 18;
    put i mixed.;
  end;
run;
类似构造的非图片格式也适用:

proc format;
value mixed
  %macro loop;
    %do i = 0 %to 99;
      &i = [2.]
      &i <-< %eval(&i+1) = [4.1]
    %end;
  %mend;
  %loop;
run;
proc格式;
价值混合
%宏循环;
%i=0%至99;
&i=[2]

&我的Best4.1在SAS 9.4中工作。但文档似乎对此感到困惑,我希望Best4.1也能工作。我的答案被删除了,所以我也在这里发布了它。
proc format;
value mixed
  %macro loop;
    %do i = 0 %to 99;
      &i = [2.]
      &i <-< %eval(&i+1) = [4.1]
    %end;
  %mend;
  %loop;
run;