Reputation: 485
I need to turn numbers from 1 - 99 into words. This is what I got so far:
num2words1 = {1: 'One', 2: 'Two', 3: 'Three', 4: 'Four', 5: 'Five', \
6: 'Six', 7: 'Seven', 8: 'Eight', 9: 'Nine', 10: 'Ten', \
11: 'Eleven', 12: 'Twelve', 13: 'Thirteen', 14: 'Fourteen', \
15: 'Fifteen', 16: 'Sixteen', 17: 'Seventeen', 18: 'Eighteen', 19: 'Nineteen'}
num2words2 = ['Twenty', 'Thirty', 'Forty', 'Fifty', 'Sixty', 'Seventy', 'Eighty', 'Ninety']
def number(Number):
if (Number > 1) or (Number < 19):
return (num2words1[Number])
elif (Number > 20) or (Number < 99):
return (num2words2[Number])
else:
print("Number Out Of Range")
main()
def main():
num = eval(input("Please enter a number between 0 and 99: "))
number(num)
main()
Now, the BIGGEST problem that I have so far is that the if, elif and else statements DO NOT seem to work. Only the first if statement runs.
The second problem is creating the string version of the numbers from 20-99....
P.S. Yes, I know about the num2word library, but I am not allowed to use it.
Upvotes: 38
Views: 198810
Reputation: 11
Thanks very much for your suggestions. This is what finally worked for me.
def number_to_text(value):
# Define the words for numbers from 0 to 19
words = {
0: 'Zero', 1: 'One', 2: 'Two', 3: 'Three', 4: 'Four', 5: 'Five',
6: 'Six', 7: 'Seven', 8: 'Eight', 9: 'Nine', 10: 'Ten',
11: 'Eleven', 12: 'Twelve', 13: 'Thirteen', 14: 'Fourteen',
15: 'Fifteen', 16: 'Sixteen', 17: 'Seventeen', 18: 'Eighteen',
19: 'Nineteen'
}
tens_words = {
20: 'Twenty', 30: 'Thirty', 40: 'Forty', 50: 'Fifty',
60: 'Sixty', 70: 'Seventy', 80: 'Eighty', 90: 'Ninety'
}
# Special case for zero
if value == 0:
return words[0]
# Split the value into dollars and cents
dollars = int(value)
cents = round((value - dollars) * 100)
result = ''
# Convert dollars part to words
if dollars >= 1000000:
result += number_to_text(dollars // 1000000) + ' Million '
dollars %= 1000000
if dollars >= 1000:
result += number_to_text(dollars // 1000) + ' Thousand '
dollars %= 1000
if dollars >= 100:
result += words[dollars // 100] + ' Hundred '
dollars %= 100
if dollars >= 20:
result += tens_words[(dollars // 10) * 10] + ' '
dollars %= 10
if dollars > 0:
result += words[dollars] + ''
result += ''
# Convert cents part to words
if cents > 0 and dollars > 0:
result += ' and ' + str(cents) + '/100'
if cents > 0 and dollars==0:
result += str(cents) + '/100'
return result
value = 10
result = number_to_text(value)
print(result)
value = 1.20
result = number_to_text(value)
print(result)
value = 1000210
result = number_to_text(value)
print(result)
value = 0.23
result = number_to_text(value)
print(result)
value = 999999
result = number_to_text(value)
print(result)
Upvotes: 0
Reputation: 11
If you are from Indian subcontinent where they use Lakhs, Crores etc. instead of Million, Billion etc. you can use this Function -
It is recursive and does not take care of decimals. You can split your number into two and print by concatenating the integer and fractional parts.
def Words(n):
units = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"]
teens = ["Ten","Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen"]
tens = ["Twenty","Thirty", "Fourty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"]
if n <=9:
return units[n]
elif n >= 10 and n <= 19:
return teens[n-10]
elif n >= 20 and n <= 99:
return tens[(n//10)-2] + " " + (units[n % 10] if n % 10 !=0 else "")
elif n >= 100 and n <= 999:
return Words(n//100) + " Hundred " + (Words(n % 100) if n % 100 !=0 else "")
elif n >= 1000 and n <= 99999:
return Words(n//1000) + " Thousand " + (Words(n % 1000) if n % 1000 !=0 else "")
elif n >= 100000 and n <= 9999999:
return Words(n//100000) + " Lakh " + (Words(n % 100000) if n % 100000 !=0 else "")
elif n >= 10000000:
return Words(n//10000000) + " Crore " + (Words(n % 10000000) if n % 10000000 !=0 else "")
This above function will generate words for number of any magnitude!
To test this i used the following code in Python -
from words import Words
import random as r
import time as t
# Forever loop generated random nos
# and prints in text
while True:
rn = r.randrange(0,1000000)
print("%7d %s" % (rn, Words(rn)))
t.sleep(0.25)
The above program generates random numbers between zero to a million and prints the word equivalent every quarter second!
Upvotes: 0
Reputation: 61
The best solution for this task is:
words = "zero one two three four five six seven eight nine" + \
" ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty" + \
" thirty forty fifty sixty seventy eighty ninety"
words = words.split(" ")
def number2words(n):
if n < 20:
return words[n]
elif n < 100:
return words[18 + n // 10] + ('' if n % 10 == 0 else '-' + words[n % 10])
elif n < 1000:
return number2words(n // 100) + " hundred" + (' ' + number2words(n % 100) if n % 100 > 0 else '')
elif n < 1000000:
return number2words(n // 1000) + " thousand" + (' ' + number2words(n % 1000) if n % 1000 > 0 else '')
Upvotes: 1
Reputation: 1
num2words1 = {1: 'One', 2: 'Two', 3: 'Three', 4: 'Four', 5: 'Five',
6: 'Six', 7: 'Seven', 8: 'Eight', 9: 'Nine', 0:"Zero"}
num = input("Enter a Number")
for i in num:
print(num2words1[(int)(i)],end=" ")
Upvotes: -3
Reputation: 133
def convert(num):
# started as grepit's version at https://stackoverflow.com/a/54002579/746054
# large constants converted to exponential notation
# orders of magnitude (oom) added
# overflow message
units = (
"", "one ", "two ", "three ", "four ", "five ", "six ", "seven ", "eight ", "nine ", "ten ", "eleven ",
"twelve ",
"thirteen ", "fourteen ", "fifteen ", "sixteen ", "seventeen ", "eighteen ", "nineteen ")
tens = ("", "", "twenty ", "thirty ", "forty ", "fifty ", "sixty ", "seventy ", "eighty ", "ninety ")
oom = ('thousand', 'million', 'billion', 'trillion', 'quadrillion', 'quintillion', 'sextillion', 'septillion',
'octillion', 'nonillion', 'decillion', 'undecillion', 'duodecillion', 'tredecillion', 'quattuordecillion',
'quindecillion', 'sexdecillion', 'septendecillion', 'octodecillion', 'novemdecillion', 'vigintillion')
if num < 0:
return "minus " + convert(-num)
if num < 20:
return units[num]
if num < 100:
return tens[num // 10] + units[num % 10]
if num < 10 ** 3:
return units[num // 10 ** 2] + "hundred " + convert(num % 10 ** 2)
for idx, name in enumerate(oom):
scale = (idx + 1) * 3
cap = scale + 3
if num < 10 ** cap:
return convert(num // 10 ** scale) + name + " " + convert(num % 10 ** scale)
return "function " + convert.__name__ + " has exhausted its vocabulary"
Upvotes: 0
Reputation: 35
class amount_to_words:
"""
Maintain a dictionary for integers from 1 to 20 and then 30,40 etc as they cant be derived.
Add denominations into the given dictionary .
"""
def __init__(
self,
dc={
1: "one",
2: "two",
3: "three",
4: "four",
5: "five",
6: "six",
7: "seven",
8: "eight",
9: "nine",
10: "ten",
11: "eleven",
12: "twelve",
13: "thirteen",
14: "fourteen",
15: "fifteen",
16: "sixteen",
17: "seventeen",
18: "eighteen",
19: "nineteen",
20: "twenty",
30: "tirty",
40: "forty",
50: "fifty",
60: "sixty",
70: "seventy",
80: "eighty",
90: "ninety",
},
denominations={
10000000: "crore",
100000: "lack",
1000: "thousand",
100: "hundred",
},
):
self.dc = dc
self.denominations = denominations
"""
returns length of the number
"""
def get_len(self, num):
return len(str(num))
"""
A recursive function to convert number to words.
The idea is when you divide and get a modulus by one of the denomination,
It might not be in the simplest and basic form ,hence deduce them /call recursively until you arrive
at the base conditions which is when the length of the number is one or two we can
directly get the values from the dictionary
"""
def convert(self, num):
if num:
if self.get_len(num) == 1:
return self.dc[num % 10]
elif self.get_len(num) == 2:
if num <= 20:
return self.dc[num]
return self.dc[num // 10 * 10] + " " + self.dc.get(num % 10, "")
else:
for d in self.denominations:
res = num // d
if res:
#convert the previous part and the final part and join them
return f"{self.convert(res)} {self.denominations[d]} {self.convert(num%d)}"
return ""
You can change the denominations as per your convention and this will work for how much ever big number you want to input
Upvotes: 0
Reputation: 1
You can do this program in this way. The range is in between 0 to 99,999
def num_to_word(num):
word_num = { "0": "zero", "00": "", "1" : "One" , "2" : "Two", "3" : "Three", "4" : "Four", "5" : "Five","6" : "Six", "7": "Seven", "8" : "eight", "9" : "Nine","01" : "One" , "02" : "Two", "03" : "Three", "04" : "Four", "05" : "Five","06" : "Six", "07": "Seven", "08" : "eight", "09" : "Nine", "10" : "Ten", "11": "Eleven", "12" :"Twelve", "13" : "Thirteen", "14" : "Fourteen", "15" : "Fifteen", "17":"Seventeen", "18" :"Eighteen", "19": "Nineteen", "20" : "Twenty", "30" : "Thirty", "40" : "Forty", "50" : "Fifty", "60" : "Sixty", "70": "seventy", "80" : "eighty", "90" : "ninety"}
keys = []
for k in word_num.keys():
keys.append(k)
if len(num) == 1:
return(word_num[num[0]])
elif len(num) == 2:
c = 0
for k in keys:
if k == num[0] + num[1]:
c += 1
if c == 1:
return(word_num[num[0] + num[1]])
else:
return(word_num[str(int(num[0]) * 10)] + " " + word_num[num[1]])
elif len(num) == 3:
c = 0
for k in keys:
if k == num[1] + num[2]:
c += 1
if c == 1:
return(word_num[num[0]]+ " Hundred " + word_num[num[1] + num[2]])
else:
return(word_num[num[0]]+ " Hundred " + word_num[str(int(num[1]) * 10)] + " " + word_num[num[2]])
elif len(num) == 4:
c = 0
for k in keys:
if k == num[2] + num[3]:
c += 1
if c == 1:
if num[1] == '0' :
return(word_num[num[0]]+ " Thousand " + word_num[num[2] + num[3]])
else:
return(word_num[num[0]]+ " Thousand " + word_num[num[1]]+ " Hundred " + word_num[num[2] + num[3]])
else:
if num[1] == '0' :
return(word_num[num[0]]+ " Thousand " + word_num[str(int(num[2]) * 10)] + " " + word_num[num[3]])
else:
return(word_num[num[0]]+ " Thousand " + word_num[num[1]]+ " Hundred " + word_num[str(int(num[2]) * 10)] + " " + word_num[num[3]])
elif len(num) == 5:
c = 0
d = 0
for k in keys:
if k == num[3] + num[4]:
c += 1
for k in keys:
if k == num[0] + num[1]:
d += 1
if d == 1:
val = word_num[num[0] + num[1]]
else:
val = word_num[str(int(num[0]) * 10)] + " " + word_num[num[1]]
if c == 1:
if num[1] == '0' :
return(val + " Thousand " + word_num[num[3] + num[4]])
else:
return(val + " Thousand " + word_num[num[2]]+ " Hundred " + word_num[num[3] + num[4]])
else:
if num[1] == '0' :
return(val + " Thousand " + word_num[str(int(num[3]) * 10)] + " " + word_num[num[4]])
else:
return(val + " Thousand " + word_num[num[2]]+ " Hundred " + word_num[str(int(num[3]) * 10)] + " " + word_num[num[4]])
num = [str(d) for d in input("Enter number: ")]
print(num_to_word(num).upper())
Upvotes: 0
Reputation: 85
Convert numbers to words:
Here is an example in which numbers have been converted into words using the dictionary.
string = input("Enter a string: ")
my_dict = {'0': 'zero', '1': 'one', '2': 'two', '3': 'three', '4': 'four', '5': 'five', '6': 'six', '7': 'seven', '8': 'eight', '9': 'nine'}
for item in string:
if item in my_dict.keys():
string = string.replace(item, my_dict[item])
print(string)
Upvotes: 1
Reputation: 21
single_digit = {0: 'zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four',
5: 'five', 6: 'six', 7: 'seven', 8: 'eight',
9: 'nine'}
teen = {10: 'ten', 11: 'eleven', 12: 'twelve', 13: 'thirteen',
14: 'fourteen', 15: 'fifteen', 16: 'sixteen',
17: 'seventeen', 18: 'eighteen', 19: 'nineteen'}
tens = {20: 'twenty', 30: 'thirty', 40: 'forty', 50: 'fifty', 60: 'sixty',
70: 'seventy', 80: 'eighty', 90: 'ninety'}
def spell_single_digit(digit):
if 0 <= digit < 10:
return single_digit[digit]
def spell_two_digits(number):
if 10 <= number < 20:
return teen[number]
if 20 <= number < 100:
div = (number // 10) * 10
mod = number % 10
if mod != 0:
return tens[div] + "-" + spell_single_digit(mod)
else:
return tens[number]
def spell_three_digits(number):
if 100 <= number < 1000:
div = number // 100
mod = number % 100
if mod != 0:
if mod < 10:
return spell_single_digit(div) + " hundred " + \
spell_single_digit(mod)
elif mod < 100:
return spell_single_digit(div) + " hundred " + \
spell_two_digits(mod)
else:
return spell_single_digit(div) + " hundred"
def spell(number):
if -1000000000 < number < 1000000000:
if number == 0:
return spell_single_digit(number)
a = ""
neg = False
if number < 0:
neg = True
number *= -1
loop = 0
while number:
mod = number % 1000
if mod != 0:
c = spell_three_digits(mod) or spell_two_digits(mod) \
or spell_single_digit(mod)
if loop == 0:
a = c + " " + a
elif loop == 1:
a = c + " thousand " + a
elif loop == 2:
a = c + " million " + a
number = number // 1000
loop += 1
if neg:
return "negative " + a
return a
Upvotes: 2
Reputation: 1123480
Your first statement logic is incorrect. Unless Number
is 1 or smaller, that statement is always True; 200 is greater than 1 as well.
Use and
instead, and include 1
in the acceptable values:
if (Number >= 1) and (Number <= 19):
You could use chaining as well:
if 1 <= Number <= 19:
For numbers of 20 or larger, use divmod()
to get both the number of tens and the remainder:
tens, remainder = divmod(Number, 10)
Demo:
>>> divmod(42, 10)
(4, 2)
then use those values to build your number from the parts:
return num2words2[tens - 2] + '-' + num2words1[below_ten]
Don't forget to account for cases when the number is above 20 and doesn't have a remainder from the divmod operation:
return num2words2[tens - 2] + '-' + num2words1[remainder] if remainder else num2words2[tens - 2]
All put together:
def number(Number):
if 0 <= Number <= 19:
return num2words1[Number]
elif 20 <= Number <= 99:
tens, remainder = divmod(Number, 10)
return num2words2[tens - 2] + '-' + num2words1[remainder] if remainder else num2words2[tens - 2]
else:
print('Number out of implemented range of numbers.')
Upvotes: 18
Reputation: 1
number=input("number")
numls20={"1":"one","2":"two","3":"three","4":"four","5":"five","6":"six","7":"seven","8":"eight","9":"nine","10":"ten","11":"elevn","12":"twelve","13":"thirteen","14":"fourteen","15":"fifteen","16":"sixteen","17":"seventeen","18":"eighteen","19":"ninteen"}
numls100={"1":"ten","2":"twenty","3":"thrity","4":"fourty","5":"fifty","6":"sixty","7":"seventy","8":"eighty","9":"ninty"}
numls1000={"1":"hundred","2":"twohundred","3":"threehundred","4":"fourhundred","5":"fivehundred","6":"sixhundred","7":"sevenhundred","8":"eighthundred","9":"ninehundred"}
def num2str(number):
if (int(number)<20):
print(numls20[number])
elif(int(number)<100):
print(numls100[number[0]]+" "+numls20[number[1]])
elif(int(number)<1000):
if ((int(number))%100 == 0):
print(numls1000[number[0]])
else:
print(numls1000[number[0]]+" and "+numls100[number[1]]+" "+numls20[number[2]])
elif(int(number)<10000):
if ((int(number))%1000 == 0):
print(numls20[number[0]]+" thousand")
elif(int(number)%100 == 0):
print(numls20[number[0]]+" thousand "+numls1000[number[1]])
elif(int(number)%10 == 0):
print(numls20[number[0]]+" thousand "+numls1000[number[1]]+" and "+numls100[number[2]])
else:
print(numls20[number[0]]+" thousand "+numls1000[number[1]]+" and "+numls100[number[2]]+" "+numls20[number[3]])
num2str(number)
Upvotes: 0
Reputation: 1
I know that this is a very old post and I am probably very late to the party, but hopefully this will help someone else. This has worked for me.
phone_words = input('Phone: ')
numbered_words = {
'0': 'zero',
'1': 'one',
'2': 'two',
'3': 'three',
'4': 'four',
'5': 'five',
'6': 'six',
'7': 'seven',
'8': 'eight',
'9': 'nine'
}
output = ""
for ch in phone_words:
output += numbered_words.get(ch, "!") + " "
phone_words = numbered_words
print(output)
Upvotes: -1
Reputation: 5138
Are you allowed to use other packages? This one works really well for me: Inflect. It is useful for natural language generation and has a method for turning numbers into english text.
I installed it with
$ pip install inflect
Then in your Python session
>>> import inflect
>>> p = inflect.engine()
>>> p.number_to_words(1234567)
'one million, two hundred and thirty-four thousand, five hundred and sixty-seven'
>>> p.number_to_words(22)
'twenty-two'
Upvotes: 33
Reputation: 22392
Many people have answered this correctly but here is another way which actually not only covers 1-99 but it actually goes above any data range but it does not cover decimals.
Note: this was tested using python 3.7
def convert(num):
units = ("", "one ", "two ", "three ", "four ","five ", "six ", "seven ","eight ", "nine ", "ten ", "eleven ", "twelve ", "thirteen ", "fourteen ", "fifteen ","sixteen ", "seventeen ", "eighteen ", "nineteen ")
tens =("", "", "twenty ", "thirty ", "forty ", "fifty ","sixty ","seventy ","eighty ","ninety ")
if num < 0:
return "minus "+convert(-num)
if num<20:
return units[num]
if num<100:
return tens[num // 10] +units[int(num % 10)]
if num<1000:
return units[num // 100] +"hundred " +convert(int(num % 100))
if num<1000000:
return convert(num // 1000) + "thousand " + convert(int(num % 1000))
if num < 1000000000:
return convert(num // 1000000) + "million " + convert(int(num % 1000000))
return convert(num // 1000000000)+ "billion "+ convert(int(num % 1000000000))
print(convert(100001333))
Upvotes: 1
Reputation: 929
code 2 and 3:
ones = {
0: '', 1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five', 6: 'six',
7: 'seven', 8: 'eight', 9: 'nine', 10: 'ten', 11: 'eleven', 12: 'twelve',
13: 'thirteen', 14: 'fourteen', 15: 'fifteen', 16: 'sixteen',
17: 'seventeen', 18: 'eighteen', 19: 'nineteen'}
tens = {
2: 'twenty', 3: 'thirty', 4: 'forty', 5: 'fifty', 6: 'sixty',
7: 'seventy', 8: 'eighty', 9: 'ninety'}
illions = {
1: 'thousand', 2: 'million', 3: 'billion', 4: 'trillion', 5: 'quadrillion',
6: 'quintillion', 7: 'sextillion', 8: 'septillion', 9: 'octillion',
10: 'nonillion', 11: 'decillion'}
def say_number(i):
"""
Convert an integer in to it's word representation.
say_number(i: integer) -> string
"""
if i < 0:
return _join('negative', _say_number_pos(-i))
if i == 0:
return 'zero'
return _say_number_pos(i)
def _say_number_pos(i):
if i < 20:
return ones[i]
if i < 100:
return _join(tens[i // 10], ones[i % 10])
if i < 1000:
return _divide(i, 100, 'hundred')
for illions_number, illions_name in illions.items():
if i < 1000**(illions_number + 1):
break
return _divide(i, 1000**illions_number, illions_name)
def _divide(dividend, divisor, magnitude):
return _join(
_say_number_pos(dividend // divisor),
magnitude,
_say_number_pos(dividend % divisor),
)
def _join(*args):
return ' '.join(filter(bool, args))
test:
def test_say_number(data, expected_output):
"""Test cases for say_number(i)."""
output = say_number(data)
assert output == expected_output, \
"\n for: {}\n expected: {}\n got: {}".format(
data, expected_output, output)
test_say_number(0, 'zero')
test_say_number(1, 'one')
test_say_number(-1, 'negative one')
test_say_number(10, 'ten')
test_say_number(11, 'eleven')
test_say_number(99, 'ninety nine')
test_say_number(100, 'one hundred')
test_say_number(111, 'one hundred eleven')
test_say_number(999, 'nine hundred ninety nine')
test_say_number(1119, 'one thousand one hundred nineteen')
test_say_number(999999,
'nine hundred ninety nine thousand nine hundred ninety nine')
test_say_number(9876543210,
'nine billion eight hundred seventy six million '
'five hundred forty three thousand two hundred ten')
test_say_number(1000**1, 'one thousand')
test_say_number(1000**2, 'one million')
test_say_number(1000**3, 'one billion')
test_say_number(1000**4, 'one trillion')
test_say_number(1000**5, 'one quadrillion')
test_say_number(1000**6, 'one quintillion')
test_say_number(1000**7, 'one sextillion')
test_say_number(1000**8, 'one septillion')
test_say_number(1000**9, 'one octillion')
test_say_number(1000**10, 'one nonillion')
test_say_number(1000**11, 'one decillion')
test_say_number(1000**12, 'one thousand decillion')
test_say_number(
1-1000**12,
'negative nine hundred ninety nine decillion nine hundred ninety nine '
'nonillion nine hundred ninety nine octillion nine hundred ninety nine '
'septillion nine hundred ninety nine sextillion nine hundred ninety nine '
'quintillion nine hundred ninety nine quadrillion nine hundred ninety '
'nine trillion nine hundred ninety nine billion nine hundred ninety nine'
' million nine hundred ninety nine thousand nine hundred ninety nine')
Upvotes: 11
Reputation: 480
def nums_to_words(string):
string = int(string) # Convert the string to an integer
one_ten=['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven',
'eight', 'nine']
ten_nineteen=['ten', 'eleven', 'twelve', 'thirteen', 'fourteen',
'fifteen',
'sixteen', 'seventeen', 'eighteen', 'nineteen']
twenty_ninety=[' ', ' ','twenty', 'thirty', 'forty', 'fifty', 'sixty',
'seventy', 'eighty',
'ninety']
temp_str = ""
if string == 0: # If the string given equals to 0
temp_str = 'zero ' # Assign the word zero to the var temp_str
# Do the calculation to find each digit of the str given
first_digit = string // 1000
second_digit = (string % 1000) // 100
third_digit = (string % 100) // 10
fourth_digit = (string % 10)
if first_digit > 0:
temp_str = temp_str + one_ten[first_digit] + ' thousand '
# one_ten[first_digit] gets you the number you need from one_ten and you add thousand (since we're trying to convert to words ofc)
# You do the same for the rest...
if second_digit > 0:
temp_str = temp_str + one_ten[second_digit] + ' hundred '
if third_digit > 1:
temp_str = temp_str + twenty_ninety[third_digit] + " "
if third_digit == 1:
temp_str = temp_str + ten_nineteen[fourth_digit] + " "
else:
if fourth_digit:
temp_str = temp_str + one_ten[fourth_digit] + " "
if temp_str[-1] == " ": # If the last index is a space
temp_str = temp_str[0:-1] # Slice it
return temp_str
I hope you get the understanding of the code slightly better; If still not understood let me know so I can try to help as much as I can.
Upvotes: 0
Reputation: 1
num2words = {1: 'One', 2: 'Two', 3: 'Three', 4: 'Four', 5: 'Five', \
6: 'Six', 7: 'Seven', 8: 'Eight', 9: 'Nine', 10: 'Ten', \
11: 'Eleven', 12: 'Twelve', 13: 'Thirteen', 14: 'Fourteen', \
15: 'Fifteen', 16: 'Sixteen', 17: 'Seventeen', 18: 'Eighteen', \
19: 'Nineteen', 20: 'Twenty', 30: 'Thirty', 40: 'Forty', \
50: 'Fifty', 60: 'Sixty', 70: 'Seventy', 80: 'Eighty', \
90: 'Ninety', 0: 'Zero'}
def n2w(n):
try:
return num2words[n]
except KeyError:
try:
return num2words[n-n%10] + num2words[n%10].lower()
except KeyError:
try:
if(n>=100 and n<=999):
w=''
w=w+str(n2w(int(n/100)))+'Hundred'
n=n-(int(n/100)*100)
if(n>0):
w=w+'And'+n2w(n)
return w
elif(n>=1000):
w=''
w=w+n2w(int(n/1000))+'Thousand'
n=n-int((n/1000))*1000
if(n>0 and n<100):
w=w+'And'+n2w(n)
if(n>=100):
w=w+n2w(int(n/100))+'Hundred'
n=n-(int(n/100)*100)
if(n>0):
w=w+'And'+n2w(n)
return w
except KeyError:
return 'Ayyao'
for i in range(0,99999):
print(n2w(i))
Upvotes: -3
Reputation: 1
def giveText(num):
pairs={1:'one',2:'two',3:'three',4:'four',5:'five',6:'six',7:'seven',8:'eight',9:'nine',10:'ten',
11:'eleven',12:'twelve',13:'thirteen',14:'fourteen',15:'fifteen',16:'sixteen',17:'seventeen',18:'eighteen',19:'nineteen',20:'twenty',
30:'thirty',40:'fourty',50:'fifty',60:'sixty',70:'seventy',80:'eighty',90:'ninety',0:''} # this and above 2 lines are actually single line
return pairs[num]
def toText(num,unit):
n=int(num)# this line can be removed
ans=""
if n <=20:
ans= giveText(n)
else:
ans= giveText(n-(n%10))+" "+giveText((n%10))
ans=ans.strip()
if len(ans)>0:
return " "+ans+" "+unit
else:
return " "
num="99,99,99,999"# use raw_input()
num=num.replace(",","")# to remove ','
try:
num=str(int(num)) # to check valid number
except:
print "Invalid"
exit()
while len(num)<9: # i want fix length so no need to check it again
num="0"+num
ans=toText( num[0:2],"Crore")+toText(num[2:4],"Lakh")+toText(num[4:6],"Thousand")+toText(num[6:7],"Hundred")+toText(num[7:9],"")
print ans.strip()
Upvotes: 0
Reputation: 1
This Did the job for me(Python 2.x)
nums = {1:"One", 2:"Two", 3:"Three" ,4:"Four", 5:"Five", 6:"Six", 7:"Seven", 8:"Eight",\
9:"Nine", 0:"Zero", 10:"Ten", 11:"Eleven", 12:"Tweleve" , 13:"Thirteen", 14:"Fourteen", \
15: "Fifteen", 16:"Sixteen", 17:"Seventeen", 18:"Eighteen", 19:"Nineteen", 20:"Twenty", 30:"Thirty", 40:"Forty", 50:"Fifty",\
60:"Sixty", 70:"Seventy", 80:"Eighty", 90:"Ninety"}
num = input("Enter a number: ")
# To convert three digit number into words
if 100 <= num < 1000:
a = num / 100
b = num % 100
c = b / 10
d = b % 10
if c == 1 :
print nums[a] + "hundred" , nums[b]
elif c == 0:
print nums[a] + "hundred" , nums[d]
else:
c *= 10
if d == 0:
print nums[a] + "hundred", nums[c]
else:
print nums[a] + "hundred" , nums[c], nums[d]
# to convert two digit number into words
elif 0 <= num < 100:
a = num / 10
b = num % 10
if a == 1:
print nums[num]
else:
a *= 10
print nums[a], nums[b]
Upvotes: 0
Reputation: 21
import math
number = int(input("Enter number to print: "))
number_list = ["zero","one","two","three","four","five","six","seven","eight","nine"]
teen_list = ["ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"]
decades_list =["twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"]
if number <= 9:
print(number_list[number].capitalize())
elif number >= 10 and number <= 19:
tens = number % 10
print(teen_list[tens].capitalize())
elif number > 19 and number <= 99:
ones = math.floor(number/10)
twos = ones - 2
tens = number % 10
if tens == 0:
print(decades_list[twos].capitalize())
elif tens != 0:
print(decades_list[twos].capitalize() + " " + number_list[tens])
Upvotes: 2
Reputation: 338
recursively:
num2words = {1: 'One', 2: 'Two', 3: 'Three', 4: 'Four', 5: 'Five', \
6: 'Six', 7: 'Seven', 8: 'Eight', 9: 'Nine', 10: 'Ten', \
11: 'Eleven', 12: 'Twelve', 13: 'Thirteen', 14: 'Fourteen', \
15: 'Fifteen', 16: 'Sixteen', 17: 'Seventeen', 18: 'Eighteen', 19: 'Nineteen'}
num2words2 = ['Twenty', 'Thirty', 'Forty', 'Fifty', 'Sixty', 'Seventy', 'Eighty', 'Ninety']
def spell(num):
if num == 0:
return ""
if num < 20:
return (num2words[num])
elif num < 100:
ray = divmod(num,10)
return (num2words2[ray[0]-2]+" "+spell(ray[1]))
elif num <1000:
ray = divmod(num,100)
if ray[1] == 0:
mid = " hundred"
else:
mid =" hundred and "
return(num2words[ray[0]]+mid+spell(ray[1]))
Upvotes: 0
Reputation: 11696
You can make this much simpler by using one dictionary and a try/except clause like this:
num2words = {1: 'One', 2: 'Two', 3: 'Three', 4: 'Four', 5: 'Five', \
6: 'Six', 7: 'Seven', 8: 'Eight', 9: 'Nine', 10: 'Ten', \
11: 'Eleven', 12: 'Twelve', 13: 'Thirteen', 14: 'Fourteen', \
15: 'Fifteen', 16: 'Sixteen', 17: 'Seventeen', 18: 'Eighteen', \
19: 'Nineteen', 20: 'Twenty', 30: 'Thirty', 40: 'Forty', \
50: 'Fifty', 60: 'Sixty', 70: 'Seventy', 80: 'Eighty', \
90: 'Ninety', 0: 'Zero'}
>>> def n2w(n):
try:
print num2words[n]
except KeyError:
try:
print num2words[n-n%10] + num2words[n%10].lower()
except KeyError:
print 'Number out of range'
>>> n2w(0)
Zero
>>> n2w(13)
Thirteen
>>> n2w(91)
Ninetyone
>>> n2w(21)
Twentyone
>>> n2w(33)
Thirtythree
Upvotes: 29
Reputation: 3459
I've been also converting numbers to words for some fuzzy matching routines. I used a library called inflect I forked off pwdyson which worked awesome:
https://github.com/pwdyson/inflect.py
Upvotes: 2
Reputation: 28279
if Number > 19 and Number < 99:
textNumber = str(Number)
firstDigit, secondDigit = textNumber
firstWord = num2words2[int(firstDigit)]
secondWord = num2words1[int(secondDigit)]
word = firstWord + secondWord
if Number <20 and Number > 0:
word = num2words1[Number]
if Number > 99:
error
Upvotes: 0