Home The Company Publications Products Links Tips

Tips, Tricks, and Techniques

Last update: 30 April 2004

Convert N7 Numeric to Text String

How can I convert a number (50) into a text string (fifty)?

1st Example

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

2nd Example

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


Top Page


Back to NATURAL Tips, Tricks, Techniques -- Overview