Difference between revisions of "Convert an integer into words"

From CodeCodex

(add Algol 68)
(Algol 68: use more natural array bounds, trap input errors)
Line 14: Line 14:
 
     BEGIN
 
     BEGIN
 
         [] STRING digits =
 
         [] STRING digits =
             (
+
             [] STRING (
 
                 "zero",
 
                 "zero",
 
                 "one",
 
                 "one",
Line 25: Line 25:
 
                 "eight",
 
                 "eight",
 
                 "nine"
 
                 "nine"
             );
+
             )[@0];
 
         [] STRING teens =
 
         [] STRING teens =
             (
+
             [] STRING (
 
                 "ten",
 
                 "ten",
 
                 "eleven",
 
                 "eleven",
Line 38: Line 38:
 
                 "eighteen",
 
                 "eighteen",
 
                 "nineteen"
 
                 "nineteen"
             );
+
             )[@0];
 
         [] STRING decades =
 
         [] STRING decades =
             (
+
             [] STRING (
 
                 "twenty",
 
                 "twenty",
 
                 "thirty",
 
                 "thirty",
Line 49: Line 49:
 
                 "eighty",
 
                 "eighty",
 
                 "ninety"
 
                 "ninety"
             );
+
             )[@2];
  
 
         PROC three digits =
 
         PROC three digits =
Line 60: Line 60:
 
                 INT units = n MOD 10;
 
                 INT units = n MOD 10;
 
                 IF n >= 100 THEN
 
                 IF n >= 100 THEN
                         digits[n OVER 100 + 1]
+
                         digits[n OVER 100]
 
                     +
 
                     +
 
                         " "
 
                         " "
Line 77: Line 77:
 
                 IF tens /= 0 THEN
 
                 IF tens /= 0 THEN
 
                     IF tens = 1 THEN
 
                     IF tens = 1 THEN
                         teens[units + 1]
+
                         teens[units]
 
                     ELSE
 
                     ELSE
                             decades[tens - 1]
+
                             decades[tens]
 
                         +
 
                         +
 
                             IF units /= 0 THEN
 
                             IF units /= 0 THEN
Line 90: Line 90:
 
             +
 
             +
 
                 IF units /= 0 AND tens /= 1 OR n = 0 THEN
 
                 IF units /= 0 AND tens /= 1 OR n = 0 THEN
                     digits[units + 1]
+
                     digits[units]
 
                 ELSE
 
                 ELSE
 
                     ""
 
                     ""
 
                 FI
 
                 FI
 
             END;
 
             END;
 
 
         INT n3 = n OVER 1 000 000;
 
         INT n3 = n OVER 1 000 000;
 
         INT n2 = n MOD 1 000 000 OVER 1000;
 
         INT n2 = n MOD 1 000 000 OVER 1000;
Line 132: Line 131:
 
     END;
 
     END;
  
DO
+
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;
 
     INT n;
 
     print("n? ");
 
     print("n? ");
 
     read((n, new line));
 
     read((n, new line));
 
     print((number words(n), new line))
 
     print((number words(n), new line))
OD
+
OD;
 +
finish:
 +
SKIP
 
</pre>
 
</pre>
  

Revision as of 00:48, 11 March 2007

Related content:

The following code will turn integer numerals (eg. 1, 2, 3) into spelled out, words (eg. "one", "two", "three").

Implementations

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