9

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

例如,我想写类似下面的内容来打印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碰巧有的任何格式。)

4

5 回答 5

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 解决方案比此代码稍快,但此代码更简单,因为不涉及宏。

于 2010-01-15T21:47:28.553 回答
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
*/
于 2009-09-09T13:37:02.280 回答
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
于 2009-09-09T13:20:56.380 回答
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;
于 2009-09-09T12:12:18.243 回答
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. 
于 2010-01-14T18:16:54.223 回答