Imported from ../bash-2.0.tar.gz.
This commit is contained in:
185
examples/scripts.noah/number.bash
Normal file
185
examples/scripts.noah/number.bash
Normal file
@@ -0,0 +1,185 @@
|
||||
# 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}" != '.' -a ".${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
|
||||
Reference in New Issue
Block a user