Kbase 21871: 4GL: How to convert a number into words.
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  3/6/2002 |
|
SUMMARY:
This solution provides Progress 4GL code to convert a number (up to 6 digits) into words.
EXPLANATION:
DEFINE VARIABLE list1 AS CHARACTER NO-UNDO INITIAL
"One,Two,Three,Four,Five,Six,Seven,Eight,Nine".
DEFINE VARIABLE list2 AS CHARACTER NO-UNDO INIT
"Ten,Eleven,Twelve,Thirteen,Fourteen,Fifteen,Sixteen,
Seventeen,Eighteen,Nineteen".
DEFINE VARIABLE list3 AS CHARACTER NO-UNDO INIT
"Twenty,Thirty,Forty,Fifty,Sixty,Seventy,Eighty,Ninety".
DEFINE VARIABLE lctext AS CHARACTER FGCOLOR 12 BGCOLOR 8
VIEW-AS editor SIZE 60 BY 2.
DEFINE VARIABLE linum AS INTEGER FORMAT '>,>>,>>9' NO-UNDO.
DEFIN BUTTON btnexi LABEL "&Exit".
FORM linum LABEL "Number" FGCOLOR 12 BGCOLOR 8 AT ROW 2 COL 2
lctext LABEL "Words " FGCOLOR 12 BGCOLOR 8 AT ROW 4 COL 2
btnexi AT ROW 7 COL 2
WITH FRAME frm TITLE "Number" SIDE-LABELS.
ENABLE btnexi WITH FRAME frm.
/******************* Trigger *****************************/
ON 'choose':U OF btnexi IN FRAME frm
DO:
QUIT.
END.
ON 'leave':U OF linum IN FRAME frm
DO:
ASSIGN linum.
CASE LENGTH(STRING(linum)):
WHEN 1 THEN DO: /* Only one digit */
IF linum = 0 THEN lctext = "Zero".
ELSE lctext = ENTRY(INT(SUBSTR(STRING(linum),1,1)),list1).
END.
WHEN 2 THEN DO: /* Two digits */
IF NOT linum < 20 THEN DO:
IF INT(SUBSTR(STRING(linum),2,1)) = 0 THEN
lctext = ENTRY(INT(SUBSTR(STRING(linum),1,1)) -
1,list3).
ELSE lctext = ENTRY(INT(SUBSTR(STRING(linum), 1,1)) -
1,list3) + " " +
ENTRY(INT(SUBSTR(STRING(linum),
2,1)),list1).
END.
ELSE lctext = ENTRY(INT(SUBSTR(STRING(linum),
LENGTH(STRING(linum)),1)) + 1,list2) .
END.
WHEN 3 THEN DO: /* Three digits */
lctext = ENTRY(INT(SUBSTR(STRING(linum),1,1)),list1) +
"-Hundred".
IF NOT INT(SUBSTR(STRING(linum),2,2)) < 20 THEN DO:
IF INT(SUBSTR(STRING(linum),3,1)) = 0 THEN
lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum),
2,1)) - 1,list3).
ELSE lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum),
2,1)) - 1,list3) + " " +
ENTRY(INT(SUBSTR(STRING(linum),3,1)),
list1).
END.
ELSE IF INT(SUBSTR(STRING(linum),2,2)) > 9 THEN
lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum),3,1))
+ 1,list2).
ELSE IF INT(SUBSTR(STRING(linum),2,2)) <> 0 THEN
lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum),3,1)),
list1).
END.
WHEN 4 THEN DO: /* Four digits*/
lctext = ENTRY(INT(SUBSTR(STRING(linum),1,1)),list1) +
"-Thousand".
IF INT(SUBSTR(STRING(linum),2,1)) <> 0 THEN
lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum),2,1)),
list1) + "-Hundred".
IF NOT INT(SUBSTR(STRING(linum),3,2)) < 20 THEN DO:
IF INT(SUBSTR(STRING(linum),4,1)) = 0 THEN
lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum), 3,1))
- 1,list3).
ELSE lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum),
3,1)) - 1,list3) + " " +
ENTRY(INT(SUBSTR(STRING(linum),
4,1)),list1).
END.
ELSE IF INT(SUBSTR(STRING(linum),3,2)) > 9 THEN
lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum),4,1))
+ 1,list2).
ELSE IF INT(SUBSTR(STRING(linum),3,2)) <> 0 THEN
lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum),4,1)),
list1).
END.
WHEN 5 THEN DO: /* Five digits*/
IF NOT INT(SUBSTR(STRING(linum),1,2)) < 20 THEN DO:
IF INT(SUBSTR(STRING(linum),2,1)) = 0 THEN
lctext = ENTRY(INT(SUBSTR(STRING(linum),1,1)) -
1,list3) + "-Thousand".
ELSE lctext = ENTRY(INT(SUBSTR(STRING(linum),1,1)) -
1,list3) + " " +
ENTRY(INT(SUBSTR(STRING(linum),
2,1)),list1) + "-Thousand".
END.
ELSE lctext = ENTRY(INT(SUBSTR(STRING(linum),2,1)) +
1,list2) +
"-Thousand".
IF INT(SUBSTR(STRING(linum),3,1)) <> 0 THEN
lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum),3,1)),
list1) + "-Hundred".
IF NOT INT(SUBSTR(STRING(linum),4,2)) < 20 THEN DO:
IF INT(SUBSTR(STRING(linum),5,1)) = 0 THEN
lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum),
4,1)) - 1,list3).
ELSE lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum),
4,1)) - 1,list3) + " " +
ENTRY(INT(SUBSTR(STRING(linum),
5,1)),list1).
END.
ELSE IF INT(SUBSTR(STRING(linum),4,2)) > 9 THEN
lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum),5,1))
+ 1,list2).
ELSE IF INT(SUBSTR(STRING(linum),4,2)) <> 0 THEN
lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum),5,1)),
list1).
END.
WHEN 6 THEN DO: /* Six digits*/
lctext = ENTRY(INT(SUBSTR(STRING(linum),1,1)),list1) +
"-Lakh".
IF NOT INT(SUBSTR(STRING(linum),2,2)) < 20 THEN DO:
IF INT(SUBSTR(STRING(linum),3,1)) = 0 THEN
lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum),
2,1)) - 1,list3) + "-Thousand".
ELSE lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum),
2,1)) - 1,list3) + " " +
ENTRY(INT(SUBSTR(STRING(linum),3,1)),
list1) + "-Thousand".
END.
ELSE IF INT(SUBSTR(STRING(linum),2,1)) <> 0 THEN
lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum),3,1))
+ 1,list2) + "-Thousand".
ELSE IF INT(SUBSTR(STRING(linum),3,1)) <> 0 THEN
lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum),3,1)),
list1) + "-Thousand".
IF INT(SUBSTR(STRING(linum),4,1)) <> 0 THEN
lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum),4,1)),
list1) + "-Hundred".
IF NOT INT(SUBSTR(STRING(linum),5,2)) < 20 THEN DO:
IF INT(SUBSTR(STRING(linum),6,1)) = 0 THEN
lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum),5,1))
- 1,list3).
ELSE lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum),
5,1)) - 1,list3) + " " +
ENTRY(INT(SUBSTR(STRING(linum),6,1))
,list1).
END.
ELSE IF INT(SUBSTR(STRING(linum),5,2)) > 9 THEN
lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum),6,1))
+ 1,list2).
ELSE IF INT(SUBSTR(STRING(linum),5,2)) <> 0 THEN
lctext = lctext + " " +
ENTRY(INT(SUBSTR(STRING(linum),6,1)),
list1).
END.
END CASE.
DISPLAY lctext WITH FRAME frm.
END.
UPDATE linum WITH FRAME frm.
WAIT-FOR choose OF btnexi.