Universe OCONV argument for zero-padding

334 views Asked by At

I'm looking for some argument (ARG) such that this code:

A = 5
B = OCONV(A,'ARG5')
PRINT B

will print to the screen

00005

Anybody know something which will do this for me?

3

There are 3 answers

0
Tim the Enchanter On

I am using UniData, but looking at the commands reference manual I can't see anything quite right, in terms of one simple argument to OCONV, or similar. I came up with these (somewhat kludgy) alternatives, though:

NUMLEN=5 VALUE=5 PRINT CHANGE(SPACES(NUMLEN-LEN(VALUE))," ","0"):VALUE

Here you are using the SPACES function to create that amount of space characters and then convert them to zeros.

PRINT OCONV(VALUE,"MR":NUMLEN:"(#####)")

This is using OCONV but has to define a string with the "mask" to only shew the final 5 digits. So if NUMLEN changes then the mask string definition would have to change.

PRINT OCONV(VALUE,"MR":NUMLEN)[3,NUMLEN]

This version uses OCONV but prints starting at the 3rd character and shews the next NUMLEN characters, therefore trimming off the initial "0." that is made by using the "MR" parameter

1
Van Amburg On

In Universe I would use the MR% conversion code. Just be aware that it will truncate anything longer than 5 characters.

A = 5
B = OCONV(A,'MR%5')
PRINT B

I use this a lot when I need to use EVAL in a conditional or as an aggregate function in a SQL or other TCL statement like to find the record with the most fields in a file.

SELECT MAX(EVAL "DCOUNT(@RECORD,@FM)") FROM VOC;
SELECT MAX(EVAL "OCONV(DCOUNT(@RECORD,@FM),'MR%8')") FROM VOC;

Masking aside these generally return 2 different values on our system.

0
Asvin On

PADDED.VALUE = VALUE 'R%5' is the simplest way to do this.