How to convert amount to word in Indian?
I was using num2words library but its is presenting wrong set of words while presenting \'lakhs\' and \'crores\'.
For ex
you can split the decimal and fractional part can call num2word function twice on number and other on fractional part
import math
def num2words(num):
under_20 = ['Zero','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']
above_100 = {100: 'Hundred',1000:'Thousand', 100000:'Lakhs', 10000000:'Crores'}
if num < 20:
return under_20[(int)(num)]
if num < 100:
return tens[(int)(num/10)-2] + ('' if num%10==0 else ' ' + under_20[(int)(num%10)])
# find the appropriate pivot - 'Million' in 3,603,550, or 'Thousand' in 603,550
pivot = max([key for key in above_100.keys() if key <= num])
return num2words((int)(num/pivot)) + ' ' + above_100[pivot] + ('' if num%pivot==0 else ' ' + num2words(num%pivot))
num="5.12"
print(num2words(int(num.split(".")[0])))
print(num2words(int(num.split(".")[1])))
https://ide.geeksforgeeks.org/J7zsZyIT6m
I guess you could just cast it on the first line if you're not handling decimals. You can also use // to do integer division.
import decimal
def num2words(num):
num = decimal.Decimal(num)
decimal_part = num - int(num)
num = int(num)
if decimal_part:
return num2words(num) + " point " + (" ".join(num2words(i) for i in str(decimal_part)[2:]))
under_20 = ['Zero', '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']
above_100 = {100: 'Hundred', 1000: 'Thousand', 100000: 'Lakhs', 10000000: 'Crores'}
if num < 20:
return under_20[num]
if num < 100:
return tens[num // 10 - 2] + ('' if num % 10 == 0 else ' ' + under_20[num % 10])
# find the appropriate pivot - 'Million' in 3,603,550, or 'Thousand' in 603,550
pivot = max([key for key in above_100.keys() if key <= num])
return num2words(num // pivot) + ' ' + above_100[pivot] + ('' if num % pivot==0 else ' ' + num2words(num % pivot))
print(num2words(decimal.Decimal("650958.32")))
# Six Lakhs Fifty Thousand Nine Hundred Fifty Eight point Three Two