Home | The Company | Publications | Products | Links | Tips |
---|
How can I convert a number (50) into a text string (fifty)?
0010 * 0020 * CONVERT N7 NUMERIC TO text string 0030 * 0040 DEFINE DATA LOCAL 0050 1 #NUM (N7) 0060 1 REDEFINE #NUM 0070 2 #MIL (N1) 0080 2 #C-K (N1) 0090 2 #TWO-DIGIT-K (N2) 0100 2 REDEFINE #TWO-DIGIT-K 0110 3 #TEN-K (N1) 0120 3 #K (N1) 0130 2 #C (N1) 0140 2 #TWO-DIGIT-UNITS (N2) 0150 2 REDEFINE #TWO-DIGIT-UNITS 0160 3 #TENS (N1) 0170 3 #UNITS (N1) 0180 1 #TWO-DIGIT (N2) 0190 1 REDEFINE #TWO-DIGIT 0200 2 #D2 (N1) 0210 2 #D1 (N1) 0220 1 #DOUBLE (A50) 0230 1 #AL (A90) 0240 1 #TEEN (A4) INIT <'TEEN'> 0250 1 #AR1(A5/0:9) INIT <' ','ONE','TWO','THREE','FOUR','FIVE', 0260 'SIX','SEVEN','EIGHT','NINE'> 0270 1 #AR2(A7/2:9) INIT <'TWENTY','THIRTY','FORTY','FIFTY','SIXTY', 0280 'SEVENTY','EIGHTY','NINETY'> 0290 1 #AR3(A7/11:13) INIT <'ELEVEN','TWELVE','THIR'> 0300 END-DEFINE 0310 INPUT '=' #NUM 0320 * 0330 #TWO-DIGIT := #TWO-DIGIT-UNITS 0340 PERFORM TWO-DIGIT 0350 #AL := #DOUBLE 0360 * 0370 IF #C > 0 0380 IF #TWO-DIGIT-UNITS = 0 0390 COMPRESS #AR1(#C) 'HUNDRED' #AL TO #AL 0400 ELSE 0410 COMPRESS #AR1(#C) 'HUNDRED AND' #AL TO #AL 0420 END-IF 0430 END-IF 0440 * 0450 IF #TWO-DIGIT-K > 0 0460 #TWO-DIGIT := #TWO-DIGIT-K 0470 PERFORM TWO-DIGIT 0480 IF #DOUBLE > ' ' 0490 COMPRESS #DOUBLE 'THOUSAND' #AL TO #AL 0500 END-IF 0510 END-IF 0520 * 0530 IF #C-K > 0 0540 IF #TWO-DIGIT-K > 1 0550 COMPRESS #AR1(#C-K) 'HUNDRED' #AL TO #AL 0560 ELSE 0570 COMPRESS #AR1(#C-K) 'HUNDRED THOUSAND' #AL TO #AL 0580 END-IF 0590 END-IF 0600 * 0610 IF #MIL > 0 0620 COMPRESS #AR1(#MIL) 'MILLION' #AL TO #AL 0630 END-IF 0640 * 0650 PRINT #AL 0660 * 0670 DEFINE SUBROUTINE TWO-DIGIT 0680 DECIDE ON FIRST VALUE #TWO-DIGIT 0690 VALUE 1:9 #DOUBLE := #AR1(#D1) 0700 VALUE 11:12 #DOUBLE := #AR3(#TWO-DIGIT) 0710 VALUE 13 COMPRESS #AR3(#TWO-DIGIT) #TEEN TO #DOUBLE LEAVING NO 0720 VALUE 14:19 COMPRESS #AR1(#D1) #TEEN TO #DOUBLE LEAVING NO 0730 VALUE 20:99 COMPRESS #AR2(#D2) #AR1(#D1) TO #DOUBLE 0740 NONE IGNORE 0750 END-DECIDE 0760 END-SUBROUTINE 0770 END
Here's the URL to the Natural Lending Library web page:
http://www.lava.net/~mhodges/
****NAT2: S /*********************************************************************** /* /* PROGRAM: DBNUMTN1 /* SYSTEM: DB /* INSTALLATION: Board of Water Supply, Honolulu /* /* PROGRAMMER: Michael Hodges /* RELEASED ON: 01-AUG-1995 11:42 AM /* /* TITLE: Convert numbers to text /* PURPOSE: Converts integers to literals. Useful for /* printing paychecks, etc. /* /* ACKNOWLEDGEMENTS: /* This function is based on an article in THE /* DEC PROFESSIONAL, May 1983, page 56, entitled /* "Converting Numbers to String Representations" /* by Steven Davis. /* /* MODIFICATIONS: /* by: /* on: /* mod: /* /*********************************************************************** DEFINE DATA PARAMETER 01 #DIGITS-NUM (N12) /* PASSED; digits to convert to text. 01 #DIGITS-TEXT (A250) /* RETURNED; digits text. LOCAL 01 #DIGITS (N12) /* Used instead of changing the passed 01 REDEFINE #DIGITS /* parameter. 02 #DIGITS-STR (A12) /* Used for formatting. 01 REDEFINE #DIGITS /* Digits handled in groups of three. 02 #3DIGIT-GROUP (N3/1:4) 01 #GROUP (N3) /* Group of three digits to processes. 01 REDEFINE #GROUP 02 #HUNDREDS (N1) /* Each digit isolated. 02 #TENS (N1) 02 #UNITS (N1) 01 #HYPHENATE (L) /* Hyphenation flag. 01 #I (P1) /* An index. 01 #IDX (P1) /* A temporary index. 01 #UNIT-TEXT (A5/1:10) /* Text for building returned string. 01 #TEEN-TEXT (A9/1:10) 01 #TEN-TEXT (A7/1:10) 01 #GROUP-TEXT (A50/1:4) END-DEFINE /*********************************************************************** /* Initializations /*********************************************************************** /* Assign the units digit literals to variables. /* ASSIGN #UNIT-TEXT (1) = 'ONE' ASSIGN #UNIT-TEXT (2) = 'TWO' ASSIGN #UNIT-TEXT (3) = 'THREE' ASSIGN #UNIT-TEXT (4) = 'FOUR' ASSIGN #UNIT-TEXT (5) = 'FIVE' ASSIGN #UNIT-TEXT (6) = 'SIX' ASSIGN #UNIT-TEXT (7) = 'SEVEN' ASSIGN #UNIT-TEXT (8) = 'EIGHT' ASSIGN #UNIT-TEXT (9) = 'NINE' /* Assign the teens digit literals to variables. /* ASSIGN #TEEN-TEXT (1) = 'ELEVEN' ASSIGN #TEEN-TEXT (2) = 'TWELVE' ASSIGN #TEEN-TEXT (3) = 'THIRTEEN' ASSIGN #TEEN-TEXT (4) = 'FOURTEEN' ASSIGN #TEEN-TEXT (5) = 'FIFTEEN' ASSIGN #TEEN-TEXT (6) = 'SIXTEEN' ASSIGN #TEEN-TEXT (7) = 'SEVENTEEN' ASSIGN #TEEN-TEXT (8) = 'EIGHTEEN' ASSIGN #TEEN-TEXT (9) = 'NINETEEN' /* Assign the tens digit literals to variables. /* ASSIGN #TEN-TEXT (2) = 'TWENTY' ASSIGN #TEN-TEXT (3) = 'THIRTY' ASSIGN #TEN-TEXT (4) = 'FORTY' ASSIGN #TEN-TEXT (5) = 'FIFTY' ASSIGN #TEN-TEXT (6) = 'SIXTY' ASSIGN #TEN-TEXT (7) = 'SEVENTY' ASSIGN #TEN-TEXT (8) = 'EIGHTY' ASSIGN #TEN-TEXT (9) = 'NINETY' /* Assign the group literals to variables. /* ASSIGN #GROUP-TEXT (1) = ' ' ASSIGN #GROUP-TEXT (2) = 'THOUSAND' ASSIGN #GROUP-TEXT (3) = 'MILLION' ASSIGN #GROUP-TEXT (4) = 'BILLION' /* Ensure that a positive number is being converted. /* IF #DIGITS-NUM GT 0 ASSIGN #DIGITS = #DIGITS-NUM ELSE COMPUTE #DIGITS = -1 * #DIGITS-NUM END-IF /* Mask, ensure leading zeros padding. /* Clear the text before beginning to build a new text string. /* MOVE RIGHT JUSTIFIED #DIGITS TO #DIGITS-STR EXAMINE #DIGITS-STR FOR " " REPLACE WITH "0" RESET #DIGITS-TEXT /*********************************************************************** /* Major Program Logic /*********************************************************************** /* Loop through the groups of three numbers: 400,030,002,001 /* each group from right to left. /* FOR #I FROM 4 TO 1 STEP -1 /* Compute the index of the next group to process. /* COMPUTE #IDX = 4 - #I + 1 /* Empty groups can be skipped. /* IF #3DIGIT-GROUP (#IDX) GT 0 /* Parse the units, tens and hundreds digits. /* ASSIGN #GROUP = #3DIGIT-GROUP (#IDX) /* Convert from numeric to text and build the returned text string. /* IF #HUNDREDS GT 0 COMPRESS #DIGITS-TEXT #UNIT-TEXT(#HUNDREDS) 'HUNDRED' INTO #DIGITS-TEXT END-IF IF #TENS EQ 1 IF #UNITS EQ 0 COMPRESS #DIGITS-TEXT 'TEN' INTO #DIGITS-TEXT ELSE COMPRESS #DIGITS-TEXT #TEEN-TEXT(#UNITS) INTO #DIGITS-TEXT END-IF ELSE IF #TENS GT 0 COMPRESS #DIGITS-TEXT #TEN-TEXT(#TENS) INTO #DIGITS-TEXT ASSIGN #HYPHENATE = TRUE ELSE RESET #HYPHENATE END-IF IF #UNITS GT 0 IF #HYPHENATE COMPRESS #DIGITS-TEXT '-' #UNIT-TEXT(#UNITS) TO #DIGITS-TEXT LEAVING NO ELSE COMPRESS #DIGITS-TEXT #UNIT-TEXT(#UNITS) TO #DIGITS-TEXT END-IF END-IF END-IF /* Add on the group text. /* COMPRESS #DIGITS-TEXT #GROUP-TEXT (#I) INTO #DIGITS-TEXT END-IF END-FOR /* If zero passed, return its text. /* IF #DIGITS-TEXT EQ ' ' ASSIGN #DIGITS-TEXT = 'ZERO' END-IF END