如何使字符变量等于任意SAS格式的数值变量的格式化值?

Sim*_*son 8 sas

如果我有一个格式的数字变量,有没有办法将格式化的值作为字符变量?

例如,我想写下面的东西来打印10/06/2009到屏幕但没有putformatted()功能.

data test;
  format i ddmmyy10.;
  i = "10JUN2009"d;
run;

data _null_;
  set test;
  i_formatted = putformatted(i); /* How should I write this? */
  put i_formatted;
run;
Run Code Online (Sandbox Code Playgroud)

(显然我可以写put(i, ddmmyy10.),但我的代码需要适用于任何格式i.)

小智 9

VVALUE函数使用与变量关联的格式格式化传递给它的变量.这是使用的代码VVALUE:

data test;
  format i ddmmyy10.;
  i = "10JUN2009"d;
run;

data _null_;
  set test;
  i_formatted = vvalue(i);
  put i_formatted;
run;
Run Code Online (Sandbox Code Playgroud)

虽然cmjohns解决方案比此代码稍快,但此代码更简单,因为不涉及宏.


Cha*_*ung 7

使用vformat()功能.

/* test data */
data test;
  i = "10jun2009"d;
  format i ddmmyy10.;
run;

/* print out the value using the associated format */
data _null_;
  set test;
  i_formatted = putn(i, vformat(i));
  put i_formatted=;
run;
/* on log
i_formatted=10/06/2099
*/
Run Code Online (Sandbox Code Playgroud)


cmj*_*hns 5

这似乎适用于我试过的一对夫妇.我使用VARFMT和宏函数来检索给定变量的格式.

 data test;
  format i ddmmyy10. b comma12.;
  i = "10JUN2009"d;
  b = 123405321;
run;


%macro  varlabel(variable) ;
  %let dsid=%sysfunc(open(&SYSLAST.)) ;
  %let varnum=%sysfunc(varnum(&dsid,&variable)) ;
  %let fmt=%sysfunc(varfmt(&dsid,&varnum));
  %let dsid=%sysfunc(close(&dsid)) ;
  &fmt
%mend varlabel;

data test2;
  set test;
  i_formatted = put(i, %varlabel(i) );
  b_formatted = put(b, %varlabel(b) );
  put i_formatted=;
  put b_formatted=;
run;
Run Code Online (Sandbox Code Playgroud)

这给了我:

i_formatted=10/06/2009
b_formatted=123,405,321
Run Code Online (Sandbox Code Playgroud)