mirror of
https://github.com/sasjs/core.git
synced 2026-01-16 21:10:05 +00:00
Merge pull request #149 from sasjs/mcf_length
feat: new mcf_length.sas fcmp macro
This commit is contained in:
80
all.sas
80
all.sas
@@ -22680,6 +22680,82 @@ run;
|
|||||||
|
|
||||||
%mend ml_json;
|
%mend ml_json;
|
||||||
/**
|
/**
|
||||||
|
@file
|
||||||
|
@brief Returns the length of a numeric value
|
||||||
|
@details
|
||||||
|
Returns the length, in bytes, of a numeric value. If the value is
|
||||||
|
missing, then 0 is returned.
|
||||||
|
|
||||||
|
The function itself takes the following (positional) parameters:
|
||||||
|
|
||||||
|
| PARAMETER | DESCRIPTION |
|
||||||
|
|---|---|
|
||||||
|
| var | variable (or value) to be tested|
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
%mcf_length(wrap=YES, insert_cmplib=YES)
|
||||||
|
|
||||||
|
data _null_;
|
||||||
|
ina=1;
|
||||||
|
inb=10000000;
|
||||||
|
inc=12345678;
|
||||||
|
ind=.;
|
||||||
|
outa=mcf_length(ina);
|
||||||
|
outb=mcf_length(inb);
|
||||||
|
outc=mcf_length(inc);
|
||||||
|
outd=mcf_length(ind);
|
||||||
|
put (out:)(=);
|
||||||
|
run;
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
> outa=3 outb=4 outc=5 outd=0
|
||||||
|
|
||||||
|
@param [out] wrap= (NO) Choose YES to add the proc fcmp wrapper.
|
||||||
|
@param [out] insert_cmplib= (NO) Choose YES to insert the package into the
|
||||||
|
CMPLIB reference.
|
||||||
|
@param [out] lib= (work) The output library in which to create the catalog.
|
||||||
|
@param [out] cat= (sasjs) The output catalog in which to create the package.
|
||||||
|
@param [out] pkg= (utils) The output package in which to create the function.
|
||||||
|
Uses a 3 part format: libref.catalog.package
|
||||||
|
|
||||||
|
<h4> Related Macros </h4>
|
||||||
|
@li mcf_length.test.sas
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
%macro mcf_length(wrap=NO
|
||||||
|
,insert_cmplib=NO
|
||||||
|
,lib=WORK
|
||||||
|
,cat=SASJS
|
||||||
|
,pkg=UTILS
|
||||||
|
)/*/STORE SOURCE*/;
|
||||||
|
|
||||||
|
%if &wrap=YES %then %do;
|
||||||
|
proc fcmp outlib=&lib..&cat..&pkg;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
function mcf_length(var);
|
||||||
|
if missing(var) then len=0;
|
||||||
|
else if trunc(var,3)=var then len=3;
|
||||||
|
else if trunc(var,4)=var then len=4;
|
||||||
|
else if trunc(var,5)=var then len=5;
|
||||||
|
else if trunc(var,6)=var then len=6;
|
||||||
|
else if trunc(var,7)=var then len=7;
|
||||||
|
else len=8;
|
||||||
|
return(len);
|
||||||
|
endsub;
|
||||||
|
|
||||||
|
%if &wrap=YES %then %do;
|
||||||
|
quit;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%if &insert_cmplib=YES %then %do;
|
||||||
|
options insert=(CMPLIB=(&lib..&cat));
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%mend mcf_length;/**
|
||||||
@file
|
@file
|
||||||
@brief Provides a replacement for the stpsrv_header function
|
@brief Provides a replacement for the stpsrv_header function
|
||||||
@details The stpsrv_header is normally a built-in function, used to set the
|
@details The stpsrv_header is normally a built-in function, used to set the
|
||||||
@@ -22750,7 +22826,7 @@ run;
|
|||||||
%if %mf_existfunction(stpsrv_header)=1 %then %return;
|
%if %mf_existfunction(stpsrv_header)=1 %then %return;
|
||||||
|
|
||||||
%if &wrap=YES %then %do;
|
%if &wrap=YES %then %do;
|
||||||
proc fcmp outcat=&lib..&cat..&pkg;
|
proc fcmp outlib=&lib..&cat..&pkg;
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
function stpsrv_header(name $, value $);
|
function stpsrv_header(name $, value $);
|
||||||
@@ -22828,7 +22904,7 @@ endsub;
|
|||||||
)/*/STORE SOURCE*/;
|
)/*/STORE SOURCE*/;
|
||||||
|
|
||||||
%if &wrap=YES %then %do;
|
%if &wrap=YES %then %do;
|
||||||
proc fcmp outcat=&lib..&cat..&pkg;
|
proc fcmp outlib=&lib..&cat..&pkg;
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
function mcf_string2file(filepath $, string $, mode $);
|
function mcf_string2file(filepath $, string $, mode $);
|
||||||
|
|||||||
77
fcmp/mcf_length.sas
Normal file
77
fcmp/mcf_length.sas
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Returns the length of a numeric value
|
||||||
|
@details
|
||||||
|
Returns the length, in bytes, of a numeric value. If the value is
|
||||||
|
missing, then 0 is returned.
|
||||||
|
|
||||||
|
The function itself takes the following (positional) parameters:
|
||||||
|
|
||||||
|
| PARAMETER | DESCRIPTION |
|
||||||
|
|---|---|
|
||||||
|
| var | variable (or value) to be tested|
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
%mcf_length(wrap=YES, insert_cmplib=YES)
|
||||||
|
|
||||||
|
data _null_;
|
||||||
|
ina=1;
|
||||||
|
inb=10000000;
|
||||||
|
inc=12345678;
|
||||||
|
ind=.;
|
||||||
|
outa=mcf_length(ina);
|
||||||
|
outb=mcf_length(inb);
|
||||||
|
outc=mcf_length(inc);
|
||||||
|
outd=mcf_length(ind);
|
||||||
|
put (out:)(=);
|
||||||
|
run;
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
> outa=3 outb=4 outc=5 outd=0
|
||||||
|
|
||||||
|
@param [out] wrap= (NO) Choose YES to add the proc fcmp wrapper.
|
||||||
|
@param [out] insert_cmplib= (NO) Choose YES to insert the package into the
|
||||||
|
CMPLIB reference.
|
||||||
|
@param [out] lib= (work) The output library in which to create the catalog.
|
||||||
|
@param [out] cat= (sasjs) The output catalog in which to create the package.
|
||||||
|
@param [out] pkg= (utils) The output package in which to create the function.
|
||||||
|
Uses a 3 part format: libref.catalog.package
|
||||||
|
|
||||||
|
<h4> Related Macros </h4>
|
||||||
|
@li mcf_length.test.sas
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
%macro mcf_length(wrap=NO
|
||||||
|
,insert_cmplib=NO
|
||||||
|
,lib=WORK
|
||||||
|
,cat=SASJS
|
||||||
|
,pkg=UTILS
|
||||||
|
)/*/STORE SOURCE*/;
|
||||||
|
|
||||||
|
%if &wrap=YES %then %do;
|
||||||
|
proc fcmp outlib=&lib..&cat..&pkg;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
function mcf_length(var);
|
||||||
|
if missing(var) then len=0;
|
||||||
|
else if trunc(var,3)=var then len=3;
|
||||||
|
else if trunc(var,4)=var then len=4;
|
||||||
|
else if trunc(var,5)=var then len=5;
|
||||||
|
else if trunc(var,6)=var then len=6;
|
||||||
|
else if trunc(var,7)=var then len=7;
|
||||||
|
else len=8;
|
||||||
|
return(len);
|
||||||
|
endsub;
|
||||||
|
|
||||||
|
%if &wrap=YES %then %do;
|
||||||
|
quit;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%if &insert_cmplib=YES %then %do;
|
||||||
|
options insert=(CMPLIB=(&lib..&cat));
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%mend mcf_length;
|
||||||
50
tests/crossplatform/mcf_length.test.sas
Normal file
50
tests/crossplatform/mcf_length.test.sas
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Testing mcf_length.sas macro
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mcf_length.sas
|
||||||
|
@li mp_assert.sas
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
%mcf_length(wrap=YES, insert_cmplib=YES)
|
||||||
|
|
||||||
|
data test;
|
||||||
|
call symputx('null',mcf_length(.));
|
||||||
|
call symputx('three',mcf_length(1));
|
||||||
|
call symputx('four',mcf_length(10000000));
|
||||||
|
call symputx('five',mcf_length(12345678));
|
||||||
|
call symputx('six',mcf_length(1234567890));
|
||||||
|
call symputx('seven',mcf_length(12345678901234));
|
||||||
|
call symputx('eight',mcf_length(12345678901234567));
|
||||||
|
run;
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%str(&null)=%str(0)),
|
||||||
|
desc=Check if NULL returns 0
|
||||||
|
)
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%str(&three)=%str(3)),
|
||||||
|
desc=Check for length 3
|
||||||
|
)
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%str(&four)=%str(4)),
|
||||||
|
desc=Check for length 4
|
||||||
|
)
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%str(&five)=%str(5)),
|
||||||
|
desc=Check for length 5
|
||||||
|
)
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%str(&six)=%str(6)),
|
||||||
|
desc=Check for length 6
|
||||||
|
)
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%str(&seven)=%str(7)),
|
||||||
|
desc=Check for length 3
|
||||||
|
)
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%str(&eight)=%str(8)),
|
||||||
|
desc=Check for length 8
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user