From: Dave Snyder <dave.snyder@das13.snide.com>
Subject: CHECK WRITING PROGRAM IN INFORMIX
Date: Fri, 19 Nov 1993 22:14:54 -0500 (EST)

In article <1993Nov19.225251.8278@nevada.edu> sxj@nye.nscee.edu (Sam Jain)
writes:
}
} Does anyone have a readymade check writing program to print checks on
} continuous perforated forms.. in particular, it would need to
} convert like 1296 - to tweleve hundred and ninety six dollars and no cents
} for checks and stuff like that
}

Do you mean like the following... BTW this program is formatted for Deluxe
Computer Check #91002 and has a dol2word() function.

Here --------- Snip Here --------- Snip Here --------- Snip Here --------- Snip

I N F O   F O R   T A B L E   apchk


Index name          Owner     Type    Cluster  Columns

ixchk_1             dave      unique  No       chk_number


Column name          Type                                    Nulls

chk_number           char(6)                                 no
chk_date             date                                    yes
chk_status           char(1)                                 yes

Here --------- Snip Here --------- Snip Here --------- Snip Here --------- Snip

I N F O   F O R   T A B L E   apinv


Index name          Owner     Type    Cluster  Columns

ixinv_1             dave      unique  No       ven_code
                                               inv_number
                                               inv_sequence


Column name          Type                                    Nulls

ven_code             char(8)                                 no
inv_number           char(10)                                no
inv_sequence         smallint                                no
inv_date             date                                    yes
inv_amount           money(8,2)                              no
inv_description      char(30)                                yes
batchnum             integer                                 yes
trn_number           integer                                 yes
chk_number           char(6)                                 yes
due_date             date                                    yes

Here --------- Snip Here --------- Snip Here --------- Snip Here --------- Snip

I N F O   F O R   T A B L E   aptrn


Index name          Owner     Type    Cluster  Columns

ixtrn_1             michele   unique  No       ven_code
                                               inv_number
                                               inv_sequence

ixtrn_2             michele   unique  No       trn_number


Column name          Type                                    Nulls

ven_code             char(8)                                 no
inv_number           char(10)                                no
inv_sequence         smallint                                no
inv_date             date                                    yes
inv_amount           money(8,2)                              no
inv_description      char(30)                                yes
batchnum             integer                                 no
trn_number           serial                                  no
chk_number           char(6)                                 yes
chk_date             date                                    yes

Here --------- Snip Here --------- Snip Here --------- Snip Here --------- Snip

I N F O   F O R   T A B L E   apven


Index name          Owner     Type    Cluster  Columns

ixven_1             dave      unique  No       ven_code


Column name          Type                                    Nulls

ven_code             char(8)                                 no
ven_name             char(30)                                yes
ven_addr1            char(30)                                yes
ven_addr2            char(30)                                yes
ven_city             char(20)                                yes
ven_state            char(2)                                 yes
ven_zip              char(10)                                yes
ven_phone            char(13)                                yes
ven_contact          char(10)                                yes
ven_ship1            char(30)                                yes
ven_ship2            char(30)                                yes
ven_ship3            char(30)                                yes

Here --------- Snip Here --------- Snip Here --------- Snip Here --------- Snip
# o_chkp.4gl
# Created by: db4glgen, v3.17 93/11/18 10:22:56


DATABASE accounting


DEFINE  w_record RECORD LIKE aptrn.*             # working record
DEFINE  gv_chk_number LIKE apchk.chk_number


{*******************************************************************************
* This program drives the aptrn screen.
*******************************************************************************}

MAIN
    DEFER INTERRUPT
    CALL menu_aptrn()
END MAIN


{*******************************************************************************
* This function handles the main ring menu.                                    *
*******************************************************************************}

FUNCTION menu_aptrn()
    CALL init_aptrn()

    OPEN FORM o_chkp FROM "o_chkp"
    DISPLAY FORM o_chkp ATTRIBUTE(BLUE)

    CALL qry_aptrn()
    IF NOT int_flag THEN
        CALL out_aptrn()
    END IF

    CLOSE FORM o_chkp
END FUNCTION


{*******************************************************************************
* This function initializes options and variables.                             *
*******************************************************************************}

FUNCTION init_aptrn()
    OPTIONS HELP FILE "o_chkp.msg"
    OPTIONS MESSAGE LINE LAST

    SELECT MAX(chk_number) INTO gv_chk_number FROM apchk
    LET gv_chk_number = gv_chk_number + 1 USING "&&&&"
END FUNCTION


{*******************************************************************************
* This function will query the database table.                                 *
*******************************************************************************}

FUNCTION qry_aptrn()
    DISPLAY "OUTPUT:  ESCAPE outputs.  CTRL-C discards output.  ARROW keys move cursor.", "" AT 1,1 ATTRIBUTE(WHITE)
    DISPLAY "Output select rows in report format.", "" AT 2,1 ATTRIBUTE(WHITE)
    MESSAGE ""

    LET int_flag = FALSE
    INPUT BY NAME gv_chk_number WITHOUT DEFAULTS HELP 2

    RETURN
END FUNCTION


{*******************************************************************************
* This function outputs the current list to the printer.
*******************************************************************************}

FUNCTION out_aptrn()
    DEFINE  w_apinv RECORD LIKE apinv.*
    DEFINE  inv_deduction LIKE apinv.inv_amount

    DECLARE out_curs CURSOR FOR
      SELECT * FROM aptrn ORDER BY ven_code, inv_number, inv_sequence

    START REPORT rpt_aptrn TO PIPE "lp -s -onlq -onoformfeed"
    FOREACH out_curs INTO w_record.*
        LET w_record.chk_date = TODAY
        SELECT inv_date,inv_amount INTO w_apinv.inv_date,w_apinv.inv_amount
          FROM apinv WHERE ven_code = w_record.ven_code
            AND inv_number = w_record.inv_number AND inv_sequence = 1
        SELECT SUM(inv_amount) INTO inv_deduction
          FROM apinv WHERE ven_code = w_record.ven_code
            AND inv_number = w_record.inv_number AND inv_sequence > 1
        IF inv_deduction IS NULL THEN
            LET inv_deduction = 0
        END IF

        OUTPUT TO REPORT rpt_aptrn(w_record.*, w_apinv.*, inv_deduction)
        UPDATE aptrn SET (chk_number, chk_date) = (gv_chk_number, w_record.chk_date)
          WHERE trn_number = w_record.trn_number
    END FOREACH
    FINISH REPORT rpt_aptrn
END FUNCTION


{*******************************************************************************
* This function does the actual formating and printing.                        *
*******************************************************************************}

REPORT rpt_aptrn(w_aptrn, w_apinv, inv_deduction)
DEFINE  w_aptrn RECORD LIKE aptrn.*
DEFINE  w_apinv RECORD LIKE apinv.*
DEFINE  inv_deduction LIKE apinv.inv_amount

    DEFINE  v_record RECORD LIKE apven.*
    DEFINE  sentence CHAR(256)
    DEFINE  i SMALLINT
    DEFINE  details SMALLINT

    OUTPUT
        TOP MARGIN 0
        BOTTOM MARGIN 0
        LEFT MARGIN 0
        PAGE LENGTH 42

    ORDER EXTERNAL BY w_aptrn.ven_code, w_aptrn.inv_number, w_aptrn.inv_sequence

    FORMAT
        PAGE HEADER
            PRINT "XXX"
            PRINT
            LET details = 0

        ON EVERY ROW
            NEED 12 LINES

            PRINT w_apinv.inv_date USING "mm/dd/yy",
              COLUMN 16, w_aptrn.inv_description,
              COLUMN 47, w_apinv.inv_amount USING "#####&.&&",
              COLUMN 59, inv_deduction USING "#####&.&&",
              COLUMN 70, w_aptrn.inv_amount USING "#####&.&&"
            LET details = details + 1

        AFTER GROUP OF w_aptrn.ven_code
            SELECT * INTO v_record.* FROM apven
              WHERE ven_code = w_aptrn.ven_code

            FOR i = 1 TO (13 - details)
                SKIP 1 LINE
            END FOR

            PRINT
            PRINT w_aptrn.chk_date USING "mm/dd/yy",
              COLUMN 13, gv_chk_number,
              COLUMN 46, GROUP SUM(w_apinv.inv_amount) USING "$$$$$$&.&&",
              COLUMN 59, GROUP SUM(inv_deduction) USING "$$$$$$&.&&",
              COLUMN 69, GROUP SUM(w_aptrn.inv_amount) USING "$$$$$$&.&&"
            PRINT
            PRINT "Paid to:  ", v_record.ven_name
            PRINT
            PRINT
            PRINT
            PRINT
            PRINT
            PRINT
            PRINT
            PRINT
            LET sentence = dol2word(GROUP SUM(w_aptrn.inv_amount))
            PRINT COLUMN 5, sentence CLIPPED
            PRINT
            LET sentence = "**$", GROUP SUM(w_aptrn.inv_amount) USING "<<<<<&.&&", "**"
            PRINT COLUMN 41, w_aptrn.chk_date USING "mm/dd/yy",
              COLUMN 54, gv_chk_number,
              COLUMN 64, 14 - LENGTH(sentence CLIPPED) SPACES, sentence CLIPPED
            PRINT
            PRINT
            PRINT COLUMN 10, v_record.ven_name
            PRINT COLUMN 10, v_record.ven_addr1
            IF v_record.ven_addr2 IS NOT NULL THEN
                PRINT COLUMN 10, v_record.ven_addr2
            END IF
            PRINT COLUMN 10, v_record.ven_city CLIPPED,
              ", ",v_record.ven_state, "  ", v_record.ven_zip
            IF v_record.ven_addr2 IS NULL THEN
                PRINT
            END IF
            LET gv_chk_number = gv_chk_number + 1 USING "&&&&"

END REPORT


FUNCTION dol2word(num_dollars)
DEFINE  num_dollars MONEY(8,2)

    DEFINE  str_dollars CHAR(9)
    DEFINE  three_digit_words CHAR(128)
    DEFINE  sentence CHAR(256)

    LET str_dollars = num_dollars USING "&&&&&&.&&"
    INITIALIZE sentence TO NULL

    IF str_dollars[1,3] != "000" THEN
        CALL three_digit_parse(str_dollars[1,3]) RETURNING three_digit_words
        LET sentence = three_digit_words CLIPPED, " THOUSAND"
    END IF

    IF str_dollars[4,6] != "000" THEN
        CALL three_digit_parse(str_dollars[4,6]) RETURNING three_digit_words
        LET sentence = sentence CLIPPED, three_digit_words CLIPPED
    END IF

    IF sentence IS NULL THEN
        LET sentence = " ZERO"
    END IF
    LET sentence = sentence CLIPPED, " AND ", str_dollars[8,9], "/100 DOLLARS"

    IF LENGTH(sentence) > 70 THEN
        LET sentence = num_dollars USING "$<<<,<<&", " AND ", str_dollars[8,9], "/100 DOLLARS"
    END IF

    RETURN sentence
END FUNCTION


FUNCTION three_digit_parse(the_number)
DEFINE  the_number CHAR(3)

    DEFINE  three_digit_words CHAR(128)
    DEFINE  tmp_words CHAR(10)

    INITIALIZE three_digit_words TO NULL

    LET tmp_words = get_hun_nits(the_number, 1)
    IF tmp_words != " ZERO" THEN
        LET three_digit_words = tmp_words CLIPPED, " HUNDRED"
    END IF

    LET tmp_words = get_tens(the_number)
    IF tmp_words != " ZERO" THEN
        LET three_digit_words = three_digit_words CLIPPED, tmp_words CLIPPED
    END IF

    IF the_number[2,2] != "1" THEN
        LET tmp_words = get_hun_nits(the_number, 3)
        IF tmp_words != " ZERO" THEN
            LET three_digit_words = three_digit_words CLIPPED, tmp_words CLIPPED
        END IF
    END IF

    RETURN three_digit_words
END FUNCTION


FUNCTION get_hun_nits(the_number, idx)
DEFINE the_number CHAR(3)
DEFINE idx SMALLINT

    CASE the_number[idx,idx]
        WHEN "0"
            RETURN " ZERO"
        WHEN "1"
            RETURN " ONE"
        WHEN "2"
            RETURN " TWO"
        WHEN "3"
            RETURN " THREE"
        WHEN "4"
            RETURN " FOUR"
        WHEN "5"
            RETURN " FIVE"
        WHEN "6"
            RETURN " SIX"
        WHEN "7"
            RETURN " SEVEN"
        WHEN "8"
            RETURN " EIGHT"
        WHEN "9"
            RETURN " NINE"
    END CASE
END FUNCTION


FUNCTION get_tens(the_number)
DEFINE the_number CHAR(3)

    DEFINE teen_words CHAR(10)

    CASE the_number[2,2]
        WHEN "0"
            RETURN " ZERO"
        WHEN "1"
            CALL get_teens(the_number) RETURNING teen_words
            RETURN teen_words
        WHEN "2"
            RETURN " TWENTY"
        WHEN "3"
            RETURN " THIRTY"
        WHEN "4"
            RETURN " FORTY"
        WHEN "5"
            RETURN " FIFTY"
        WHEN "6"
            RETURN " SIXTY"
        WHEN "7"
            RETURN " SEVENTY"
        WHEN "8"
            RETURN " EIGHTY"
        WHEN "9"
            RETURN " NINETY"
    END CASE
END FUNCTION


FUNCTION get_teens(the_number)
DEFINE the_number CHAR(3)

    CASE
        WHEN the_number[2,3] = "10"
            RETURN " TEN"
        WHEN the_number[2,3] = "11"
            RETURN " ELEVEN"
        WHEN the_number[2,3] = "12"
            RETURN " TWELVE"
        WHEN the_number[2,3] = "13"
            RETURN " THIRTEEN"
        WHEN the_number[2,3] = "14"
            RETURN " FOURTEEN"
        WHEN the_number[2,3] = "15"
            RETURN " FIFTEEN"
        WHEN the_number[2,3] = "16"
            RETURN " SIXTEEN"
        WHEN the_number[2,3] = "17"
            RETURN " SEVENTEEN"
        WHEN the_number[2,3] = "18"
            RETURN " EIGHTEEN"
        WHEN the_number[2,3] = "19"
            RETURN " NINETEEN"
    END CASE
END FUNCTION


Here --------- Snip Here --------- Snip Here --------- Snip Here --------- Snip

DAS
-- 
David Snyder @ Snide Computer Services - Folcroft, PA         Current Release
                                                              is db4glgen-3.17
UUCP:  ..!uunet!das13!dave   INTERNET:  dave.snyder@snide.com

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

From: dennisp@informix.com (Dennis Pimple)
Subject: Showing Written $ Amounts
Date: 26 Dec 1995 16:05:16 GMT

Steven Jay Evans (sevans@vixa.voyager.net) wrote:
: Any one know how to (Under Informix 4gl) chaanges ie. $24.50 into Twenty F four dollars and 50/100

: E-mail at sevans@vixa.voyager.net

This is in the FAQ, but below is my version

=======================================================================
Dennis J. Pimple         dennisp@informix.com    Opinions expressed
Principal Consultant     --------------------    are mine, and do not
Informix Software Inc    Voice:  303-850-0210    necessarily reflect
Denver Colorado USA      Fax:    303-779-4025    those of my employer.
#######     ######   Dennis J. Pimple
##    ##    ##    #  Denver, CO
##    ##    ##    #  ===================================================
##    ## ## ######   Client: Informix User's Group
##    ## ## ## File: %M%  SCCS: %I% %P%
#######  ## ## Date: %G% %U%
         ##    Program: Translate money to a CHAR text,
    #    ##             like for check printing
     #####

#---------------------------------------------------------------------#
MAIN
# Arguments: N/A
# Purpose:   For testing the money input.
#            Just enter an interrupt to quit.
#            REMOVE MAIN TO IMPLEMENT THIS MODULE INTO AN APPLICATION
# Returns:   N/A
#---------------------------------------------------------------------#
DEFINE mny      MONEY
DEFINE mstrg    CHAR(80)

CLEAR SCREEN

WHILE TRUE
    PROMPT "Enter number 0 - 999999.99: " FOR mny
    LET mstrg = fmt_money(mny)
    MESSAGE mstrg CLIPPED
END WHILE

END MAIN

#---------------------------------------------------------------------#
FUNCTION fmt_money(mny)
# Arguments: Amount of money to format
# Purpose:   Format money amount into a character string
# Returns:   CHAR(80) with the money string
# Usage:     LET charvar = fmt_money(moneyvar)
#    or:     CALL fmt_money(moneyvar) RETURNING charvar
# The return can change according to the maximum amount of the money
# Hundreds of thousands (777,777.00) requires char(77)
# Tens of thousands (77,777.00) requires char(61)
# Thousands (7,777.00) requires char(53)
# Hundreds (777.00) requires char(38)
# if you never write a check in the hundreds,
# you don't need this program
# change the LET mlgth statement below to reflect any change you make
# to rstrg
#---------------------------------------------------------------------#
DEFINE mny      MONEY       # amount passed
DEFINE mstrg    CHAR(9)     # mny amount in a string
DEFINE nstrg    CHAR(3)     # hundreds digitaly (eg: "090")
DEFINE hstrg    CHAR(30)    # hundreds in char format
DEFINE lgth     SMALLINT    # length measurment
DEFINE rstrg    CHAR(80)    # Return string;CHANGE THIS LENGTH AS REQ
DEFINE mlgth    SMALLINT    # length of mstrg

# set mlgth to the max length of rstrg
LET mlgth = 80

IF mny IS NULL THEN
    LET mny = 0
END IF

LET mstrg = mny USING "<<<<<<.&&"

LET rstrg = ""
LET lgth = LENGTH(mstrg)
IF lgth > 6 THEN
    # this number is in the thousands
    # caculate how many thousands and reduce the mstrg to hundreds
    CASE
    WHEN lgth = 9
        # hundreds of thousands
        LET nstrg = mstrg[1,3]
        LET mstrg = mstrg[4,9]
    WHEN lgth = 8
        # tens of thousands
        LET nstrg = mstrg[1,2]
        LET mstrg = mstrg[3,8]
    WHEN lgth = 7
        # single thousands
        LET nstrg = mstrg[1]
        LET mstrg = mstrg[2,7]
    END CASE
    # nstrg now holds a number between 1 and 999
    LET hstrg = fmt_hund(nstrg)
    LET rstrg = rstrg CLIPPED, " ", hstrg CLIPPED, " THOUSAND"
END IF

LET lgth = LENGTH(mstrg)
IF lgth > 3 THEN
    # this number is in the hundreds
    CASE
    WHEN lgth = 6
        # hundreds
        LET nstrg = mstrg[1,3]
        LET mstrg = mstrg[4,6]
    WHEN lgth = 5
        # tens
        LET nstrg = mstrg[1,2]
        LET mstrg = mstrg[3,5]
    WHEN lgth = 4
        # single digits
        LET nstrg = mstrg[1]
        LET mstrg = mstrg[2,4]
    END CASE
    # nstrg now holds a number between 1 and 999
    LET hstrg = fmt_hund(nstrg)
    # add it to the (possible) thousands
    LET rstrg = rstrg CLIPPED, " ", hstrg CLIPPED
END IF

IF LENGTH(rstrg) = 0 THEN
    # if we still have nothing, there was no dollars
    LET rstrg = " ZERO"
END IF
# put the cents on as a fraction of hundreds
LET rstrg = rstrg CLIPPED, " AND ", mstrg[2,3], "/100"

# fill the left of the string with ***
# REMOVE THE NEXT THREE LINES IF YOU DON'T WANT THIS DONE
WHILE LENGTH(rstrg) < mlgth
    LET rstrg = "*", rstrg CLIPPED
END WHILE

RETURN rstrg

END FUNCTION
# fmt_money(mny)

#---------------------------------------------------------------------#
FUNCTION fmt_hund(nstrg)
# Arguments: CHAR(3) string 000 - 999 with the possible hundreds
# Purpose:   Format hundreds amount into a character string
# Returns:   CHAR(30) with the hundreds format
#---------------------------------------------------------------------#
DEFINE nstrg    CHAR(3)     # "000" - "999"
DEFINE n1       CHAR(1)     # single digits tester
DEFINE n2       CHAR(2)     # double digits tester
DEFINE lgth     SMALLINT    # length measurement
DEFINE hstrg    CHAR(30)    # hundreds string to return
DEFINE tstrg    CHAR(13)    # tens string to get from fmt_tens
DEFINE x        SMALLINT    # a little counter

LET lgth = LENGTH(nstrg)
# since nstrg might be 000 or 010 or something like that,
# we need to remove any leading zeros
FOR x = 1 TO lgth
    IF nstrg[1] = "0" THEN
        LET nstrg = nstrg[2,lgth]
    ELSE
        EXIT FOR
    END IF
END FOR

LET lgth = LENGTH(nstrg)
CASE
WHEN lgth = 3
    # hundreds
    LET n1 = nstrg[1]
    LET hstrg = fmt_digit(n1)
    LET hstrg = hstrg CLIPPED, " HUNDRED"
    LET n2 = nstrg[2,3]
    # get the tens part of this number
    LET tstrg = fmt_tens(n2)
    LET hstrg = hstrg CLIPPED, " ", tstrg CLIPPED
WHEN lgth = 2
    # tens
    LET n2 = nstrg CLIPPED
    LET hstrg = fmt_tens(n2)
WHEN lgth = 1
    LET n1 = nstrg CLIPPED
    LET hstrg = fmt_digit(n1)
END CASE

RETURN hstrg

END FUNCTION
# fmt_hund(nstrg)

#---------------------------------------------------------------------#
FUNCTION fmt_tens(n)
# Arguments: CHAR(2) string 00 - 99 with the possible tens
# Purpose:   Format tens amount into a character string
# Returns:   CHAR(30) with the tens format
#---------------------------------------------------------------------#
DEFINE n     CHAR(2)
DEFINE tstrg CHAR(30)

CASE
WHEN n = "10"
    LET tstrg = "TEN"
WHEN n = "11"
    LET tstrg = "ELEVEN"
WHEN n = "12"
    LET tstrg = "TWELVE"
WHEN n = "13"
    LET tstrg = "THIRTEEN"
WHEN n = "14"
    LET tstrg = "FOURTEEN"
WHEN n = "15"
    LET tstrg = "FIFTEEN"
WHEN n = "16"
    LET tstrg = "SIXTEEN"
WHEN n = "17"
    LET tstrg = "SEVENTEEN"
WHEN n = "18"
    LET tstrg = "EIGHTEEN"
WHEN n = "19"
    LET tstrg = "NINETEEN"
OTHERWISE
    # we can get the singles digit from fmt_digit
    LET tstrg = fmt_digit(n[2])
    CASE
    WHEN n[1] = "2"
        LET tstrg = "TWENTY ", tstrg CLIPPED
    WHEN n[1] = "3"
        LET tstrg = "THIRTY ", tstrg CLIPPED
    WHEN n[1] = "4"
        LET tstrg = "FORTY ", tstrg CLIPPED
    WHEN n[1] = "5"
        LET tstrg = "FIFTY ", tstrg CLIPPED
    WHEN n[1] = "6"
        LET tstrg = "SIXTY ", tstrg CLIPPED
    WHEN n[1] = "7"
        LET tstrg = "SEVENTY ", tstrg CLIPPED
    WHEN n[1] = "8"
        LET tstrg = "EIGHTY ", tstrg CLIPPED
    WHEN n[1] = "9"
        LET tstrg = "NINETY ", tstrg CLIPPED
    END CASE
END CASE

RETURN tstrg

END FUNCTION
# fmt_tens(n)

#---------------------------------------------------------------------#
FUNCTION fmt_digit(n)
# Arguments: CHAR(1) string 0 - 9 with the possible digits
# Purpose:   Format digits amount into a character string
# Returns:   CHAR(5) with the digits format
#---------------------------------------------------------------------#
DEFINE n CHAR(1)

CASE
WHEN n = "0"
    RETURN ""
WHEN n = "1"
    RETURN "ONE"
WHEN n = "2"
    RETURN "TWO"
WHEN n = "3"
    RETURN "THREE"
WHEN n = "4"
    RETURN "FOUR"
WHEN n = "5"
    RETURN "FIVE"
WHEN n = "6"
    RETURN "SIX"
WHEN n = "7"
    RETURN "SEVEN"
WHEN n = "8"
     RETURN "EIGHT"
WHEN n = "9"
    RETURN "NINE"
END CASE

END FUNCTION
# fmt_digit(n)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

From: PAKHRI@aseam.po.my (Ahmad Pakhri Yahya / Aseam6)
Subject: Re: Showing Written $ Amounts
Date: 31 Dec 1995 23:08:04 -0500

Steven Jay Evans (sevans@vixa.voyager.net) wrote:
: Any one know how to (Under Informix 4gl) chaanges ie. $24.50 into
Twenty F four dollars and 50/100

: E-mail at sevans@vixa.voyager.net

Below is my way of doing it, I think may be you need to modify a bit.
# Function testword() below is just a temporary function to test
# the numtowrd(numvar) function in converting the number into word. To
# use the numtowrd(numvar) function, just call from anywhere in in the
# program. This function receive a decimal(20,2) data type and return
# a char(250) data type.  If the original number is not decimal(20,2),
# it can be converted to this data type easily.

FUNCTION testword()
   define num decimal(20,2),
      dnum char(27),
      wrd char(250),
      x char(1)
   open window w_pwrd at 6,30
      with 1 rows, 18 columns
      attribute (border)
   whenever error continue
   error "PLEASE ENTER NUMBERS ONLY"
   prompt "" for num
   let wrd = numtowrd(num)
   close window w_pwrd
   let formname = formpath, "dnumwrd"
   open window w_dwrd at 9,2
      with form formname
   display wrd to wrd
   let dnum = num using "$$$$,$$$,$$$,$$$,$$$,$$$.&&"
   display dnum to dnum
   prompt "" for char x
   close window w_dwrd
END FUNCTION

FUNCTION numtowrd(numvar)
   define aa, bb, cc, dd, ee, ff, gg smallint,
      numvar decimal(20,2),
      numalp char(21),
      numcha char(3),
      numwrd1, numwrd2 char(250)
   call repo_id("numtowrd","fnc_fl5")
   let numwrd1 = ""
   let numalp = numvar
   let aa = length(numalp)
   let bb = aa mod 3
   let cc = aa / 3
   for dd = 1 to cc
      let ee = aa - ((dd - 1) * 3)
      let ff = ee - 2
      let numcha = numalp[ff,ee]
      let numwrd1 = cnv(dd,numcha)
      let numwrd2 = numwrd1 clipped, numwrd2 clipped
   end for
   if bb <> 0 then
      let numcha = numalp[1,bb]
      case bb
         when 1 let numcha = "00", numcha clipped
         when 2 let numcha = "0", numcha clipped
      end case
      let numwrd1 = cnv(dd,numcha)
      let numwrd2 = numwrd1 clipped, numwrd2 clipped
   end if
   let numwrd2 = "Ringgit Malaysia :", numwrd2 clipped, " Only"
   return(numwrd2)
END FUNCTION

FUNCTION cnv(no1,ch1)
   define no1 smallint,
      ch1 char(3),
      sch char(1),
      dch char(2),
      wrd char(50)
   if ch1 = "000" or ch1 = ".00" then
      if no1 = 1 and ch1 = ".00" then
         let wrd = ""
         return(wrd)
      else
         let wrd = ""
         return(wrd)
      end if
   end if
   let sch = ch1[1]
   case ch1[1]
      when "0"   let wrd = ""
      when ""    let wrd = ""
      when "."   let wrd = " and sen"
      otherwise  let wrd = cnv1(sch) clipped, " Hundred"
   end case
   let dch = ch1[2,3]
   case ch1[2]
      when ""    let wrd = wrd clipped, ""
      when "1"   let wrd = wrd clipped, cnv2(dch) clipped
      otherwise  let wrd = wrd clipped, cnv3(dch) clipped
   end case
   case no1
      when 1     let wrd = wrd clipped, ""
      when 2     let wrd = wrd clipped, ""
      when 3     let wrd = wrd clipped, " Thousand"
      when 4     let wrd = wrd clipped, " Million"
      when 5     let wrd = wrd clipped, " Billion"
      when 6     let wrd = wrd clipped, " Trillion"
      when 7     let wrd = wrd clipped, " Zillion"
   end case
   return(wrd)
END FUNCTION

FUNCTION cnv1(num1)
   define num1 char(1),
      wrd1 char(30)
   case num1
      when "1"   let wrd1 = " One"
      when "2"   let wrd1 = " Two"
      when "3"   let wrd1 = " Three"
      when "4"   let wrd1 = " Four"
      when "5"   let wrd1 = " Five"
      when "6"   let wrd1 = " Six"
      when "7"   let wrd1 = " Seven"
      when "8"   let wrd1 = " Eight"
      when "9"   let wrd1 = " Nine"
   end case
   return(wrd1)
END FUNCTION

FUNCTION cnv2(num1)
   define num1 char(2),
      wrd1 char(30)
   case num1[2]
      when "0"   let wrd1 = " Ten"
      when "1"   let wrd1 = " Eleven"
      when "2"   let wrd1 = " Twelve"
      when "3"   let wrd1 = " Thirteen"
      when "4"   let wrd1 = " Fourteen"
      when "5"   let wrd1 = " Fifteen"
      when "6"   let wrd1 = " Sixteen"
      when "7"   let wrd1 = " Seventeen"
      when "8"   let wrd1 = " Eighteen"
      when "9"   let wrd1 = " Nineteen"
   end case
   return(wrd1)
END FUNCTION

FUNCTION cnv3(num1)
   define num1 char(2),
      num2 char(1),
      wrd1 char(30)
   case num1[1]
      when "0"   let wrd1 = ""
      when "2"   let wrd1 = " Twenty"
      when "3"   let wrd1 = " Thirty"
      when "4"   let wrd1 = " Forty"
      when "5"   let wrd1 = " Fifty"
      when "6"   let wrd1 = " Sixty"
      when "7"   let wrd1 = " Seventy"
      when "8"   let wrd1 = " Eighty"
      when "9"   let wrd1 = " Ninety"
   end case
   let num2 = num1[2]
   let wrd1 = wrd1 clipped, cnv1(num2) clipped
   return(wrd1)
END FUNCTION


  ---------------
      ///I\\\    Ahmad Pakhri Yahya (pakhri@aseam.po.my)
     // o o \\   Supervisor, Admin, Root, DBA
     //  v  \\   ----------------------------------------------------
     //  -  \\   ISD, Aseambankers Malaysia Berhad
    ///     \\\  Kuala Lumpur, Malaysia.
  ---------------

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

From: junet@informix.com (June Tong)
Subject: Re: Displaying money values as words (check writing)
Date: 3 Jul 1996 18:09:18 GMT

mhodges (mhodges@bessel.nando.net) wrote:
: I need to write out money variables to a report as words instead of
: numbers to print checks (i.e. ONE THOUSAND TWO HUNDRED THIRTY AND NO CENTS).

4GL?  I put some 4GL code in our TechInfo database (may be accessible via
I-Link but I'm not sure) that does that.  I didn't write it myself, and I
don't remember whether I even tested it before I put it there, so if you have
any problems with it, you didn't get it from me ;-)  I've attached it below,
in case you don't have access to I-Link or it's not there.  BTW, I-Link does
contain a lot of useful (and useless) stuff like this.  (Oh boy, I'm starting
to sound like Clem, plugging our other services ;-)

June

----   June Tong                              Informix Software    ----
----   Senior Consultant                      (415) 926-6140       ----
----   International Support                  junet@informix.com   ----
----       Location-du-jour: Miami                                 ----
*
* Standard disclaimers apply
*
- Please do not send me requests/questions by mail.  When I have the knowledge
- and time permits, I try to answer questions on comp.databases.informix, but
- travel schedule, time, and volume make responding to personal requests
- difficult and often slow.  Please call your local Informix Technical Support
- organization for assistance with technical issues.

----------------------------  TI #4160  ----------------------------


Title:   Print English Text for American Money Values (for checks)
Sub. Date:    04/15/1993

This 4GL program produces the American-English representation of a money value
(in American Dollars).

Short Desc:
     Would like to have character representation of money for checks

Long Desc:
     It would be nice to have a function to print the  character string of a
     money field, as is done on checks.
     $250.00 would be printed Two Hundred and Fifty  Dollars and No Cents.

----------------------------  Cut Here  ----------------------------

globals
    define tens array[10] of varchar(20)
    define ones array[20] of varchar(20)
    define units array[22] of varchar(20)
end globals

main
    call init_names()
    call number(0)
    call number(12)
    call number(1234)
    call number(1234.78)
    call number(1234567890.12)
    call number(1000)
    call number(2000000)
    call number(3000000000.0)
    call number(40000000000000.0)
    call number(5000000000000000.0)
    call number(6000000000000000000.0)
    call number(7000000000000000000000.0)
    call number(8000000000000000000000000.0)
    call number(1.23456789e27)
    call number(1.23456789e28)
    call number(1.23456789e29)
end main

function number(m)
    define m money(32,2),
    result varchar(255)

    call mtoa(m, 0) returning result
    display m, " = ", result
end function

function init_names()
    let ones[1] = "One"
    let ones[2] = "Two"
    let ones[3] = "Three"
    let ones[4] = "Four"
    let ones[5] = "Five"
    let ones[6] = "Six"
    let ones[7] = "Seven"
    let ones[8] = "Eight"
    let ones[9] = "Nine"
    let ones[10] = "Ten"
    let ones[11] = "Eleven"
    let ones[12] = "Twelve"
    let ones[13] = "Thirteen"
    let ones[14] = "Fourteen"
    let ones[15] = "Fifteen"
    let ones[16] = "Sixteen"
    let ones[17] = "Seventeen"
    let ones[18] = "Eighteen"
    let ones[19] = "Nineteen"

    let tens[1] = "Ten"
    let tens[2] = "Twenty"
    let tens[3] = "Thirty"
    let tens[4] = "Forty"
    let tens[5] = "Fifty"
    let tens[6] = "Sixty"
    let tens[7] = "Seventy"
    let tens[8] = "Eighty"
    let tens[9] = "Ninety"

    let units[1] = "Thousand"
    let units[2] = "Million"
    let units[3] = "Billion"
    let units[4] = "Trillion"
    let units[5] = "Quadrillion"
    let units[6] = "Quintillion"
    let units[7] = "Sextillion"
    let units[8] = "Septillion"
    let units[9] = "Octillion"
    let units[10] = "Nonillion"
    let units[11] = "Decillion"
    let units[12] = "Undecillion"
    let units[13] = "Duodecillion"
    let units[14] = "Tredecillion"
    let units[15] = "Quattuordecillion"
    let units[16] = "Quindecillion"
    let units[17] = "Sexdecillion"
    let units[18] = "Septendecillion"
    let units[19] = "Octodecillion"
    let units[20] = "Novemdecillion"
    let units[21] = "Vigintillion"
end function

function mtoa(m, level)
    define m decimal(32,2),
	old decimal(32,2),
	level int,
	x, y, z int,
	string varchar(255),
	temp char(40)


    if (m < 1 and level > 0) then
	return ""
    end if

    let old = m

    call take_digit(m) returning m, z
    call take_digit(m) returning m, y
    call take_digit(m) returning m, x

    let string = ""
    if (x > 0  and x < 10) then
        let string = concat(ones[x], "Hundred")
    end if

    if (y) then
	if (y == 1) then
	    let string = concat(string, ones[y*10 + z])
	    let z = 0
	else
	    let string = concat(string, tens[y])
	end if
    end if

    if (z) then
        let string = concat(string, ones[z])
    end if

    if (level >= 1 and string is not null) then
	let string = concat(string, units[level])
    end if

    if (level == 0) then
        if (m == 0 and string is null) then
	    let string = "Zero"
	end if
	let temp = old
	let x = length(temp)
	let temp = temp[x - 1, x]
	let string = concat(string, "and")
	let string = string, " ", temp clipped, "/100 Dollars"
    end if

    let string = concat(mtoa(m, level + 1),  string)
    return string
end function

function take_digit(m)
    define m decimal(32, 2),
	x varchar(50),
	i int

    let x = m
    let m = m / 10
    let i = length(x)
    return m, x[i-3]
end function

function concat(a, b)
    define a, b, c varchar(200)
    if (a) then
        let c = a clipped, " ", b
        return c
    else
	return b
    end if
end function

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
