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}" != '.' && test ".${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
|
---|