Number names

Revision as of 12:37, 27 September 2008 by rosettacode>NevilleDNZ (→‎[[#ALGOL 68]]: www.codecodex.com/wiki/index.php%3Ftitle%3DConvert_an_integer_into_words - GPL)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

ALGOL 68

PROC number words =

 (
   INT n
 ) STRING :
   # returns a string representation of n in words. Currently
   deals with anything from 0 to 999 999 999. #
   BEGIN
       [] STRING digits =
           [] STRING (
               "zero",
               "one",
               "two",
               "three",
               "four",
               "five",
               "six",
               "seven",
               "eight",
               "nine"
           )[@0];
       [] STRING teens =
           [] STRING (
               "ten",
               "eleven",
               "twelve",
               "thirteen",
               "fourteen",
               "fifteen",
               "sixteen",
               "seventeen",
               "eighteen",
               "nineteen"
           )[@0];
       [] STRING decades =
           [] STRING (
               "twenty",
               "thirty",
               "forty",
               "fifty",
               "sixty",
               "seventy",
               "eighty",
               "ninety"
           )[@2];
       PROC three digits =
         (
           INT n
         ) STRING :
           # does the conversion for n from 0 to 999. #
           BEGIN
               INT tens = n MOD 100 OVER 10;
               INT units = n MOD 10;
               IF n >= 100 THEN
                       digits[n OVER 100]
                   +
                       " "
                   +
                       "hundred"
                   +
                       IF n MOD 100 /= 0 THEN
                           " and "
                       ELSE
                           ""
                       FI
               ELSE
                   ""
               FI
           +
               IF tens /= 0 THEN
                   IF tens = 1 THEN
                       teens[units]
                   ELSE
                           decades[tens]
                       +
                           IF units /= 0 THEN
                               "-"
                           ELSE
                               ""
                           FI
                   FI
               FI
           +
               IF units /= 0 AND tens /= 1 OR n = 0 THEN
                   digits[units]
               ELSE
                   ""
               FI
           END;
       INT n3 = n OVER 1 000 000;
       INT n2 = n MOD 1 000 000 OVER 1000;
       INT n1 = n MOD 1000;
           IF n3 /= 0 THEN
               three digits(n3) + " million"
           ELSE
               ""
           FI
       +
           IF n3 /= 0 AND (n2 /= 0 OR n1 >= 100) THEN
               ", "
           ELSE
               ""
           FI
       +
           IF n2 /= 0 THEN
               three digits(n2) + " thousand"
           ELSE
               ""
           FI
       +
           IF (n3 /= 0 OR n2 /= 0) AND n1 > 0 AND n1 < 100 THEN
               " and "
           ELIF n2 /= 0 AND n1 /= 0 THEN
               ", "
           ELSE
               ""
           FI
       +
           IF n1 /= 0 OR n = 0 THEN
               three digits(n1)
           ELSE
               ""
           FI
   END;

DO # until user hits EOF #

   on logical file end(standin, (REF FILE f) BOOL : GOTO finish);
   on value error(standin, (REF FILE f) BOOL : GOTO finish);
   INT n;
   print("n? ");
   read((n, new line));
   print((number words(n), new line))

OD; finish: SKIP