]>
Commit | Line | Data |
---|---|---|
ccc6cda3 JA |
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 | * ) | |
b80f6443 | 111 | if test ".${val2}" != '.' && test ".${d1}" != '.0' ; then |
ccc6cda3 JA |
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 |