代码之家  ›  专栏  ›  技术社区  ›  Simon Nickerson

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

sas
  •  8
  • Simon Nickerson  · 技术社区  · 15 年前

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

    例如,我想写一些像下面这样的东西来打印 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 回复  |  直到 13 年前
        1
  •  9
  •   secoskyj    14 年前

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

    data test;
      format i ddmmyy10.;
      i = "10JUN2009"d;
    run;
    
    data _null_;
      set test;
      i_formatted = vvalue(i);
      put i_formatted;
    run;
    

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

        2
  •  7
  •   Chang Chung    15 年前

    使用 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
    */
    
        3
  •  5
  •   cmjohns    15 年前

    这对我试过的夫妇来说似乎很管用。我使用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
    
        4
  •  3
  •   Simon Nickerson    15 年前

    我可以用宏代码和 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;
    
        5
  •  0
  •   Triad sou. DaveW    13 年前

    是的,有一个putformated()函数。实际上,有两个: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.