(python3.5.1 )Write a new version of the program that converts an integer into i
ID: 3691238 • Letter: #
Question
(python3.5.1)Write a new version of the program that converts an integer into its English name (found in "int_name.py") to use a dictionary instead of if statements.
##(Int_name,py:) ####
# This program turns an integer into its English name.
#
def main() :
value = int(input("Please enter a positive integer < 1000000000: "))
print(intName(value))
## Turns a number into its English name.
# @param number a poistive integer < 1,000,000,000
# @return the name of the number (e.g. "two hundred seventy four")
#
def intName(number) :
name = ""
part = number
if part >= 1000000 :
name = name + intName1000(part // 1000000) + " million "
part = part % 1000000
if part >= 1000 :
name = name + intName1000(part // 1000) + " thousand "
part = part % 1000
if part >= 1 :
name = name + intName1000(part)
part = part
return name
## Turns a number into its English name.
# @param number a poistive integer < 1,000
# @return the name of the number (e.g. "two hundred seventy four")
#
def intName1000(number) :
part = number # The part that still needs to be converted.
name = "" # The name of the number.
if part >= 100 :
name = digitName(part // 100) + " hundred"
part = part % 100
if part >= 20 :
name = name + " " + tensName(part)
part = part % 10
elif part >= 10 :
name = name + " " + teenName(part)
part = 0
if part > 0 :
name = name + " " + digitName(part)
return name
## Turns a digit into its English name.
# @param digit an integer between 1 and 9
# @return the name of digit ("one" ... "nine")
#
def digitName(digit) :
if digit == 1: return "one"
if digit == 2: return "two"
if digit == 3: return "three"
if digit == 4: return "four"
if digit == 5: return "five"
if digit == 6: return "six"
if digit == 7: return "seven"
if digit == 8: return "eight"
if digit == 9: return "nine"
return ""
## Turns a number between 10 and 19 into its English name.
# @param number an integer between 10 and 19
# @return the name of the given number ("ten" ... "nineteen")
#
def teenName(number) :
if number == 10 : return "ten"
if number == 11 : return "eleven"
if number == 12 : return "twelve"
if number == 13 : return "thirteen"
if number == 14 : return "fourteen"
if number == 15 : return "fifteen"
if number == 16 : return "sixteen"
if number == 17 : return "seventeen"
if number == 18 : return "eighteen"
if number == 19 : return "nineteen"
return ""
## Gives the name of the tens part of a number between 20 and 99.
# @param number an integer between 20 and 99
# @return the name of the tens part of the number ("twenty" ... "ninety")
#
def tensName(number) :
if number >= 90 : return "ninety"
if number >= 80 : return "eighty"
if number >= 70 : return "seventy"
if number >= 60 : return "sixty"
if number >= 50 : return "fifty"
if number >= 40 : return "forty"
if number >= 30 : return "thirty"
if number >= 20 : return "twenty"
return ""
# Call the main function.
main()
Explanation / Answer
# Create the lists of word-equivalents from 1-19, then one for the tens group.
# Finally, a list of the (for lack of a better word) "zero-groups".
ByOne = [
"zero",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine",
"ten",
"eleven",
"twelve",
"thirteen",
"fourteen",
"fifteen",
"sixteen",
"seventeen",
"eighteen",
"nineteen"
]
ByTen = [
"zero",
"ten",
"twenty",
"thirty",
"forty",
"fifty",
"sixty",
"seventy",
"eighty",
"ninety"
]
zGroup = [
"",
"thousand",
"million",
"billion",
"trillion",
"quadrillion",
"quintillion",
"sextillion",
"septillion",
"octillion",
"nonillion",
"decillion",
"undecillion",
"duodecillion",
"tredecillion",
"quattuordecillion",
"sexdecillion",
"septendecillion",
"octodecillion",
"novemdecillion",
"vigintillion"
]
strNum = raw_input("Please enter an integer: >> ")
# A recursive function to get the word equivalent for numbers under 1000.
def subThousand(inputNum):
"""Convert a number < 1000 to words, and 0 to the empty string
"""
num = int(inputNum) #this should be done at higher level
hundreds, 100)
parts = []
if hundreds:
parts.append(ByOne[hundreds] + " hundred")
if ones:
parts.append(subHundred(ones))
return " and ".join(parts)
def thousandUp(n):
assert(isinstance(n,(int, long)))
assert(0 <= n)
return ", ".join(reversed([subThousand(z) + (" " + zGroup[i] if i else "") if z else "" for i,z in enumerate(splitByThousands(n))]))
def splitByThousands(n):
assert(isinstance(n,(int, long)))
assert(0 <= n)
res = []
while n:
n, r = divmod(n, 1000)
res.append(r)
return res
def get_number_as_words(n):
assert(isinstance(n,(int, long)))
if n==0:
return "Zero"
return ("Minus " if n < 0 else "") + thousandUp(abs(n))
def subHundred(num):
"""Convert a number < 100 to words, and 0 to the empty string
"""
if num >= 20:
tens, 10)
else:
tens, num
parts = []
if tens:
parts.append(ByTen[tens])
if ones:
parts.append(ByOne[ones])
return "-".join(parts)
def main():
n = 95505896639631893 # int(raw_input("Please enter an integer: >> "))
expected='ninety-five quadrillion, five hundred and five trillion, eight hundred and ninety-six billion, six hundred and thirty-nine million, six hundred and thirty-one thousand, eight hundred and ninety-three'
print(get_number_as_words(n))
print(expected)
assert(get_number_as_words(n)==expected)
if __name__ == "__main__":
main()
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.