Imported from ../bash-2.0.tar.gz.
[platform/upstream/bash.git] / examples / scripts.noah / number.bash
1 # number.bash
2 # Author: Noah Friedman <friedman@prep.ai.mit.edu>
3 # Created: 1993-02-22
4 # Last modified: 1993-04-01
5 # Public domain
6
7 # Conversion to bash v2 syntax done by Chet Ramey
8
9 # Commentary:
10 # Code:
11
12 #:docstring number:
13 # Usage: number [number]
14 #
15 # Converts decimal integers to english notation.  Spaces and commas are
16 # optional.  Numbers 67 digits and larger will overflow this script.
17 #
18 # E.g: number 99,000,000,000,000,454
19 #      => ninety-nine quadrillion four hundred fifty-four
20 #
21 #:end docstring:
22
23 function number ()
24 {
25  local result
26  local val1
27  local val2
28  local val3
29  local d1
30  local d2
31  local d3
32
33    case "$*" in
34       *[!0-9,.]* ) 
35          echo "number: invalid character in argument." 1>&2
36          return 1 
37         ;;
38       *.* ) 
39          echo "number: fractions not supported (yet)." 1>&2
40          return 1 
41         ;;
42    esac
43
44    result=''
45
46    eval set - "`echo ${1+\"$@\"} | sed -n -e '
47       s/[, ]//g;s/^00*/0/g;s/\(.\)\(.\)\(.\)$/\"\1 \2 \3\"/;
48       :l
49       /[0-9][0-9][0-9]/{
50          s/\([^\" ][^\" ]*\)\([^\" ]\)\([^\" ]\)\([^\" ]\)/\1\"\2 \3 \4\"/g;
51          t l
52       }
53       /^[0-9][0-9][0-9]/s/\([^\" ]\)\([^\" ]\)\([^\" ]\)/\"\1 \2 \3\"/;
54       /^[0-9][0-9]/s/\([^\" ]\)\([^\" ]\)/\"\1 \2\"/;
55       /^[0-9]/s/^\([^\" ][^\" ]*\)/\"\1\"/g;s/\"\"/\" \"/g;p;'`"
56
57    while test $# -ne 0 ; do
58       eval `set - $1; 
59             d3='' d2='' d1=''
60             case $# in
61                1 ) d1=$1 ;;
62                2 ) d2=$1 d1=$2 ;;
63                3 ) d3=$1 d2=$2 d1=$3 ;;
64             esac
65             echo "d3=\"${d3}\" d2=\"${d2}\" d1=\"${d1}\""`
66
67       val1='' val2='' val3=''
68
69       case "${d3}" in
70          '1' ) val3='one'   ;;
71          '2' ) val3='two'   ;;
72          '3' ) val3='three' ;;
73          '4' ) val3='four'  ;;
74          '5' ) val3='five'  ;;
75          '6' ) val3='six'   ;;
76          '7' ) val3='seven' ;;
77          '8' ) val3='eight' ;;
78          '9' ) val3='nine'  ;;
79       esac
80
81       case "${d2}" in
82          '1' ) val2='teen'    ;;
83          '2' ) val2='twenty'  ;;
84          '3' ) val2='thirty'  ;;
85          '4' ) val2='forty'   ;;
86          '5' ) val2='fifty'   ;;
87          '6' ) val2='sixty'   ;;
88          '7' ) val2='seventy' ;;
89          '8' ) val2='eighty'  ;;
90          '9' ) val2='ninety'  ;;
91       esac
92
93       case "${val2}" in
94          'teen')
95             val2=''
96             case "${d1}" in
97                '0') val1='ten'       ;;
98                '1') val1='eleven'    ;;
99                '2') val1='twelve'    ;;
100                '3') val1='thirteen'  ;;
101                '4') val1='fourteen'  ;;
102                '5') val1='fifteen'   ;;
103                '6') val1='sixteen'   ;;
104                '7') val1='seventeen' ;;
105                '8') val1='eighteen'  ;;
106                '9') val1='nineteen'  ;;
107             esac
108            ;;
109          0 ) : ;;
110          * )
111             if test ".${val2}" != '.' -a ".${d1}" != '.0' ; then
112                val2="${val2}-"
113             fi
114             case "${d1}" in
115                '0') val2="${val2} " ;;
116                '1') val1='one'    ;;
117                '2') val1='two'    ;;
118                '3') val1='three'  ;;
119                '4') val1='four'   ;;
120                '5') val1='five'   ;;
121                '6') val1='six'    ;;
122                '7') val1='seven'  ;;
123                '8') val1='eight'  ;;
124                '9') val1='nine'   ;;
125             esac
126            ;;
127       esac
128
129       if test ".${val3}" != '.' ; then
130          result="${result}${val3} hundred "
131       fi
132
133       if test ".${val2}" != '.' ; then
134          result="${result}${val2}"
135       fi
136
137       if test ".${val1}" != '.' ; then
138          result="${result}${val1} "
139       fi
140
141       if test ".${d1}${d2}${d3}" != '.000' ; then
142          case $# in
143              0 | 1 ) ;;
144              2 ) result="${result}thousand " ;;
145              3 ) result="${result}million " ;;
146              4 ) result="${result}billion " ;;
147              5 ) result="${result}trillion " ;;
148              6 ) result="${result}quadrillion " ;;
149              7 ) result="${result}quintillion " ;;
150              8 ) result="${result}sextillion " ;;
151              9 ) result="${result}septillion " ;;
152             10 ) result="${result}octillion " ;;
153             11 ) result="${result}nonillion " ;;
154             12 ) result="${result}decillion " ;;
155             13 ) result="${result}undecillion " ;;
156             14 ) result="${result}duodecillion " ;;
157             15 ) result="${result}tredecillion " ;;
158             16 ) result="${result}quattuordecillion " ;;
159             17 ) result="${result}quindecillion " ;;
160             18 ) result="${result}sexdecillion " ;;
161             19 ) result="${result}septendecillion " ;;
162             20 ) result="${result}octodecillion " ;;
163             21 ) result="${result}novemdecillion " ;;
164             22 ) result="${result}vigintillion " ;;
165             * )
166                echo "Error: number too large (66 digits max)." 1>&2
167                return 1
168               ;;
169          esac
170       fi
171
172       shift
173    done
174
175    set - ${result}
176    case "$*" in
177       '') set - 'zero' ;;
178    esac
179
180    echo ${1+"$@"}
181 }
182
183 provide number
184
185 # number.bash ends here