如果我有一个格式的数字变量,有没有办法将格式化的值作为字符变量?
例如,我想写下面的东西来打印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解决方案比此代码稍快,但此代码更简单,因为不涉及宏.
使用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)
这似乎适用于我试过的一对夫妇.我使用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)