185 lines
5 KiB
Bash
185 lines
5 KiB
Bash
# number.bash
|
|
# Author: Noah Friedman <friedman@prep.ai.mit.edu>
|
|
# Created: 1993-02-22
|
|
# Last modified: 1993-04-01
|
|
# Public domain
|
|
|
|
# Conversion to bash v2 syntax done by Chet Ramey
|
|
|
|
# Commentary:
|
|
# Code:
|
|
|
|
#:docstring number:
|
|
# Usage: number [number]
|
|
#
|
|
# Converts decimal integers to english notation. Spaces and commas are
|
|
# optional. Numbers 67 digits and larger will overflow this script.
|
|
#
|
|
# E.g: number 99,000,000,000,000,454
|
|
# => ninety-nine quadrillion four hundred fifty-four
|
|
#
|
|
#:end docstring:
|
|
|
|
function number ()
|
|
{
|
|
local result
|
|
local val1
|
|
local val2
|
|
local val3
|
|
local d1
|
|
local d2
|
|
local d3
|
|
|
|
case "$*" in
|
|
*[!0-9,.]* )
|
|
echo "number: invalid character in argument." 1>&2
|
|
return 1
|
|
;;
|
|
*.* )
|
|
echo "number: fractions not supported (yet)." 1>&2
|
|
return 1
|
|
;;
|
|
esac
|
|
|
|
result=''
|
|
|
|
eval set - "`echo ${1+\"$@\"} | sed -n -e '
|
|
s/[, ]//g;s/^00*/0/g;s/\(.\)\(.\)\(.\)$/\"\1 \2 \3\"/;
|
|
:l
|
|
/[0-9][0-9][0-9]/{
|
|
s/\([^\" ][^\" ]*\)\([^\" ]\)\([^\" ]\)\([^\" ]\)/\1\"\2 \3 \4\"/g;
|
|
t l
|
|
}
|
|
/^[0-9][0-9][0-9]/s/\([^\" ]\)\([^\" ]\)\([^\" ]\)/\"\1 \2 \3\"/;
|
|
/^[0-9][0-9]/s/\([^\" ]\)\([^\" ]\)/\"\1 \2\"/;
|
|
/^[0-9]/s/^\([^\" ][^\" ]*\)/\"\1\"/g;s/\"\"/\" \"/g;p;'`"
|
|
|
|
while test $# -ne 0 ; do
|
|
eval `set - $1;
|
|
d3='' d2='' d1=''
|
|
case $# in
|
|
1 ) d1=$1 ;;
|
|
2 ) d2=$1 d1=$2 ;;
|
|
3 ) d3=$1 d2=$2 d1=$3 ;;
|
|
esac
|
|
echo "d3=\"${d3}\" d2=\"${d2}\" d1=\"${d1}\""`
|
|
|
|
val1='' val2='' val3=''
|
|
|
|
case "${d3}" in
|
|
'1' ) val3='one' ;;
|
|
'2' ) val3='two' ;;
|
|
'3' ) val3='three' ;;
|
|
'4' ) val3='four' ;;
|
|
'5' ) val3='five' ;;
|
|
'6' ) val3='six' ;;
|
|
'7' ) val3='seven' ;;
|
|
'8' ) val3='eight' ;;
|
|
'9' ) val3='nine' ;;
|
|
esac
|
|
|
|
case "${d2}" in
|
|
'1' ) val2='teen' ;;
|
|
'2' ) val2='twenty' ;;
|
|
'3' ) val2='thirty' ;;
|
|
'4' ) val2='forty' ;;
|
|
'5' ) val2='fifty' ;;
|
|
'6' ) val2='sixty' ;;
|
|
'7' ) val2='seventy' ;;
|
|
'8' ) val2='eighty' ;;
|
|
'9' ) val2='ninety' ;;
|
|
esac
|
|
|
|
case "${val2}" in
|
|
'teen')
|
|
val2=''
|
|
case "${d1}" in
|
|
'0') val1='ten' ;;
|
|
'1') val1='eleven' ;;
|
|
'2') val1='twelve' ;;
|
|
'3') val1='thirteen' ;;
|
|
'4') val1='fourteen' ;;
|
|
'5') val1='fifteen' ;;
|
|
'6') val1='sixteen' ;;
|
|
'7') val1='seventeen' ;;
|
|
'8') val1='eighteen' ;;
|
|
'9') val1='nineteen' ;;
|
|
esac
|
|
;;
|
|
0 ) : ;;
|
|
* )
|
|
if test ".${val2}" != '.' && test ".${d1}" != '.0' ; then
|
|
val2="${val2}-"
|
|
fi
|
|
case "${d1}" in
|
|
'0') val2="${val2} " ;;
|
|
'1') val1='one' ;;
|
|
'2') val1='two' ;;
|
|
'3') val1='three' ;;
|
|
'4') val1='four' ;;
|
|
'5') val1='five' ;;
|
|
'6') val1='six' ;;
|
|
'7') val1='seven' ;;
|
|
'8') val1='eight' ;;
|
|
'9') val1='nine' ;;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
if test ".${val3}" != '.' ; then
|
|
result="${result}${val3} hundred "
|
|
fi
|
|
|
|
if test ".${val2}" != '.' ; then
|
|
result="${result}${val2}"
|
|
fi
|
|
|
|
if test ".${val1}" != '.' ; then
|
|
result="${result}${val1} "
|
|
fi
|
|
|
|
if test ".${d1}${d2}${d3}" != '.000' ; then
|
|
case $# in
|
|
0 | 1 ) ;;
|
|
2 ) result="${result}thousand " ;;
|
|
3 ) result="${result}million " ;;
|
|
4 ) result="${result}billion " ;;
|
|
5 ) result="${result}trillion " ;;
|
|
6 ) result="${result}quadrillion " ;;
|
|
7 ) result="${result}quintillion " ;;
|
|
8 ) result="${result}sextillion " ;;
|
|
9 ) result="${result}septillion " ;;
|
|
10 ) result="${result}octillion " ;;
|
|
11 ) result="${result}nonillion " ;;
|
|
12 ) result="${result}decillion " ;;
|
|
13 ) result="${result}undecillion " ;;
|
|
14 ) result="${result}duodecillion " ;;
|
|
15 ) result="${result}tredecillion " ;;
|
|
16 ) result="${result}quattuordecillion " ;;
|
|
17 ) result="${result}quindecillion " ;;
|
|
18 ) result="${result}sexdecillion " ;;
|
|
19 ) result="${result}septendecillion " ;;
|
|
20 ) result="${result}octodecillion " ;;
|
|
21 ) result="${result}novemdecillion " ;;
|
|
22 ) result="${result}vigintillion " ;;
|
|
* )
|
|
echo "Error: number too large (66 digits max)." 1>&2
|
|
return 1
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
shift
|
|
done
|
|
|
|
set - ${result}
|
|
case "$*" in
|
|
'') set - 'zero' ;;
|
|
esac
|
|
|
|
echo ${1+"$@"}
|
|
}
|
|
|
|
provide number
|
|
|
|
# number.bash ends here
|