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

时间:2009-09-09 12:11:11

标签: sas

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

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碰巧所具有的任何格式。)

5 个答案:

答案 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.