如果我有一个格式的数字变量,有没有办法将格式化的值作为字符变量?
e.g。我想写下以下内容将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;
(显然我可以写put(i, ddmmyy10.)
,但我的代码需要适用于i
碰巧所具有的任何格式。)
答案 0 :(得分:9)
VVALUE
函数使用与变量关联的格式格式化传递给它的变量。以下是使用VVALUE
的代码:
data test;
format i ddmmyy10.;
i = "10JUN2009"d;
run;
data _null_;
set test;
i_formatted = vvalue(i);
put i_formatted;
run;
虽然cmjohns解决方案比此代码稍快,但此代码更简单,因为没有涉及宏。
答案 1 :(得分: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
*/
答案 2 :(得分: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;
这给了我:
i_formatted=10/06/2009
b_formatted=123,405,321
答案 3 :(得分:3)
我可以使用宏代码和sashelp.vcolumn
执行此操作,但它有点繁琐。
proc sql noprint;
select trim(left(format)) into :format
from sashelp.vcolumn
where libname eq 'WORK' and memname eq 'TEST';
run;
data test2;
set test;
i_formatted = put(i, &format);
put i_formatted;
run;
答案 4 :(得分:0)
是的,有一个putformatted()函数。实际上,有两个:putc()和putn()。 Putc处理字符格式,putn()数字。您的代码需要查看格式名称(所有且唯一的字符格式以“$”开头)确定要使用的格式。这是putc的语法(来自交互式帮助):
PUTC(source, format.<,w>)
参数
source
is the SAS expression to which you want to apply the format.
format.
is an expression that contains the character format you want to apply to source.
w
specifies a width to apply to the format.
Interaction: If you specify a width here, it overrides any width specification
in the format.