BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
bsas94
Obsidian | Level 7

Hi experts!

 

I've been searching but I did not found anything about creating a sas format to add leading zeros in a character variable using PROC FORMAT.

 

The objective is to use this format whenever I want, for example, using it in SAS Marketing Automation export definitions etc.

 

I've tried links similar to this: http://www2.sas.com/proceedings/sugi31/243-31.pdf.

 

Does anyone know?

 

Thanks a lot!

 

BS

1 ACCEPTED SOLUTION

Accepted Solutions
Reeza
Super User

Full solution put together:

 

1. Define function

2. Create format

3. Apply format using format statement

4. Convert to new variable using PUT() statement

 

/*1*/
proc fcmp outlib=work.functions.myfunc;
function leadZ(x $) $;
xx = catt(repeat('0',6-length(x)),x);
return (xx);
endsub;
run;

/*2*/
options cmplib=work.functions;

proc format;
value $leadZ other=[leadZ()];
run;

data sample;
  input x $6. ;
  /*3 - for demonstration purpose*/
  y=x; 
  format y $leadz.; 

  z=put(x, $leadz.); /*4*/
datalines;
test
tes
;
run;
proc print data=sample noobs label;
title 'Sample output';
label x='Raw data (x)' 
y='Underlying data is raw data, format applied (y)' 
z='Converted to new char variable (z)';
run;

View solution in original post

13 REPLIES 13
PeterClemmensen
Tourmaline | Level 20

Why do you wan to solve this with a format? 🙂 Could you not just concatenate woth a leading zero?

bsas94
Obsidian | Level 7

The objetive is to use this format whenever I want, for example, using it in SAS Marketing Automation export definitions etc.

 

It would be necessary to create it using PROC FORMAT so I can save the format to the catalog.

PeterClemmensen
Tourmaline | Level 20

Or like this

 

data have;
    length CharacterVar $ 5 WithZeros $ 5;
    input CharacterVar;

    WithZeros = put(input(CharacterVar,best5.),z5.);
datalines;
73345
6378
286
26
4
9644
94
;
run;
GreggB
Pyrite | Level 9

I don't what the range of your char var is. this will work for 2 bytes.

 

data have;
input id var1 $2.;
datalines;
1 8
2 9
3 10

4 99
;
run;
proc print;
run;
data want;
set have;
newvar=put(input(var1,3.),z3.);
run;

bsas94
Obsidian | Level 7

Guys,

 

The objetive is to use this format whenever I want, for example, using it in SAS Marketing Automation export definitions etc. 

 

I should create it using PROC FORMAT. 

 

Tks,

Reeza
Super User

You can create a function via PROC FCMP that does the conversion and implement this via a FORMAT. 

The SAS documentation for PROC FORMAT has an example of this type of implementation but converting Celsius to Fahrenheit I believe. 

 

So the answer to your question is, yes, it's possible. 

Reeza
Super User

And since a character can't always be read as a number I suggest using this function instead:

Assuming length of field required is 6. 

 

xx = cats(repeat('0',6-length(x)-1), x);

http://www.listendata.com/2016/07/sas-add-leading-zeros-to-variable.html

 

You do need SAS 9.3+ for this to work. 

 

bsas94
Obsidian | Level 7

Hi Reeza,

 

I'm having some troubles. When I run the following program I created:

 

 

 

proc fcmp outlib=work.functions.myfunc;
function leadZ(x $);
xx = cats(repeat('0',6-length(x)-1),x);
return (xx);
endsub;
run;

options cmplib=work.functions;

proc format;
value $leadZ other=[leadZ()];
run;

data x;
infile datalines;
input x $leadZ.;
datalines;
test
tes
;
run;

 

 

 

I get the following error:

 

 

2                                                          The SAS System                          13:38 Wednesday, November 9, 2016

36         
37         data x;
38         infile datalines;
39         input x $leadZ.;
                   _______
                   485
NOTE 485-185: Informat $LEADZ was not found or could not be loaded.

 

 

Do you have any idea how to fix it?

 

PS: It's my first time creating a function 🙂

 

Tks,

 

Reeza
Super User

In proc format you create a format not an informat. 

 

Either apply the format instead of using it as an informat or create an informat. 

 

Im assuming you also tried FILL with a picture format. 

bsas94
Obsidian | Level 7

Hi,

 

You're correct. I'm trying to fill with a picture format.

 

Now:

 

proc fcmp outlib=work.functions.myfunc;
	function leadZ(x $);
		xx = cats(repeat('0',6-length(x)-1),x);
		return (xx);
	endsub;
run;

options cmplib=work.functions;

proc sql;
	create table x (
		a VARCHAR(6),
		b VARCHAR(6)
		);
	insert into x values("123","123");
quit;

proc print data=x;
format a $leadZ.;
run;

 

Now I don't get any errors, but when I check in the result generated by proc print, there's no difference when it comes to the format being applied.

 

Any ideas?

 

Tks for the help so far!

Tom
Super User Tom
Super User

You created a FORMAT, but then you tried to use an INFORMAT that you did NOT create. Try running this code instead.

 

data x;
  input x $6 ;
  put x= $leadZ. ;
datalines;
test
tes
;

Also you forgot to include a $ in your function defintion so that SAS knows that it returns a character string.

proc fcmp outlib=work.functions.myfunc;
function leadZ(x $) $;
xx = cats(repeat('0',6-length(x)-1),x);
return (xx);
endsub;
run;

 

Reeza
Super User

Full solution put together:

 

1. Define function

2. Create format

3. Apply format using format statement

4. Convert to new variable using PUT() statement

 

/*1*/
proc fcmp outlib=work.functions.myfunc;
function leadZ(x $) $;
xx = catt(repeat('0',6-length(x)),x);
return (xx);
endsub;
run;

/*2*/
options cmplib=work.functions;

proc format;
value $leadZ other=[leadZ()];
run;

data sample;
  input x $6. ;
  /*3 - for demonstration purpose*/
  y=x; 
  format y $leadz.; 

  z=put(x, $leadz.); /*4*/
datalines;
test
tes
;
run;
proc print data=sample noobs label;
title 'Sample output';
label x='Raw data (x)' 
y='Underlying data is raw data, format applied (y)' 
z='Converted to new char variable (z)';
run;
bsas94
Obsidian | Level 7

It worked just fine!

 

I'll try to find a way to change the part when I explicitly define the variable length is 6. 

 

In any case, thanks a lot!

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 13 replies
  • 2593 views
  • 5 likes
  • 5 in conversation