Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
# Transpiled from here: https://github.com/virgil-av/numbers-to-words-romanian | |
import re | |
import math | |
TEN = 10 | |
ONE_HUNDRED = 100 | |
ONE_THOUSAND = 1000 | |
ONE_MILLION = 1000000 | |
ONE_BILLION = 1000000000 | |
ONE_TRILLION = 1000000000000 | |
LESS_THAN_TWENTY = [ | |
'zero', | |
'unu', | |
'doi', | |
'trei', | |
'patru', | |
'cinci', | |
'șase', | |
'șapte', | |
'opt', | |
'nouă', | |
'zece', | |
'unsprezece', | |
'doisprezece', | |
'treisprezece', | |
'paisprezece', | |
'cincisprezece', | |
'șaisprezece', | |
'șaptesprezece', | |
'optsprezece', | |
'nouăsprezece', | |
] | |
TENTHS_LESS_THAN_HUNDRED = [ | |
'zero', | |
'zece', | |
'douăzeci', | |
'treizeci', | |
'patruzeci', | |
'cincizeci', | |
'șaizeci', | |
'șaptezeci', | |
'optzeci', | |
'nouăzeci', | |
] | |
def parseDecimals (nr): | |
decimals = int(str(int(nr*100)/100).split(".")[1]) | |
word = "" | |
if decimals>0: | |
word += " virgulă" | |
if decimals < 10: | |
word += "zero " | |
word += generateWords(decimals, []) | |
return word | |
def match (nr, numberUnitsSingular, numberUnitsPlural): | |
string = "" | |
if nr==1: | |
string = numberUnitsSingular | |
elif nr==2: | |
string = "două " + numberUnitsPlural | |
elif nr<20 or (nr > 100 and nr % 100 < 20): | |
string = generateWords(nr, []) + " " + numberUnitsPlural | |
else: | |
words = generateWords(nr, []) | |
if nr % 10 == 2: | |
words = re.sub("doi$", "două", words) | |
string = words + " de " + numberUnitsPlural | |
return string | |
def generateWords (nr, words = []): | |
remainder = 0 | |
word = "" | |
if math.isnan(nr): | |
return "nan" | |
if nr > ONE_TRILLION - 1: | |
return nr | |
if nr==0: | |
if len(words): | |
words = " ".join(words) | |
words = re.sub(",$", "", words) | |
words = re.sub("\s{2,}", " ", words) | |
return words | |
else: | |
return "zero" | |
if nr<0: | |
words.append("minus") | |
nr = abs(nr) | |
if nr<20: | |
remainder = 0 | |
word = LESS_THAN_TWENTY[int(nr)] | |
word += parseDecimals(nr) | |
elif nr < ONE_HUNDRED: | |
remainder = int(nr % TEN) | |
word = TENTHS_LESS_THAN_HUNDRED[int(nr / TEN)] | |
if remainder: | |
word += " și " | |
elif nr < ONE_THOUSAND: | |
remainder = nr % ONE_HUNDRED | |
hundreds = int(nr / ONE_HUNDRED) | |
if hundreds==1: | |
word = "o sută" | |
elif hundreds==2: | |
word = "două sute" | |
else: | |
word = generateWords(hundreds, []) + " sute" | |
elif nr<ONE_MILLION: | |
remainder = nr % ONE_THOUSAND | |
thousands = int(nr / ONE_THOUSAND) | |
word = match(thousands, "o mie", "mii") | |
elif nr<ONE_BILLION: | |
remainder = nr % ONE_MILLION | |
millions = int(nr / ONE_MILLION) | |
word = match(millions, "un milion", "milioane") | |
elif nr<ONE_TRILLION: | |
remainder = nr % ONE_BILLION | |
billions = int(nr/ONE_BILLION) | |
word = match(billions, "un miliard", "miliarde") | |
words.append(word) | |
return generateWords(remainder, words) | |
if __name__ == '__main__': | |
# Test | |
print(generateWords(100)) | |
print(generateWords(125)) | |
print(generateWords(118931)) | |
print(generateWords(1259631)) | |
print(generateWords(101230465)) | |
print(generateWords(5101230465)) | |
print(generateWords(999999999999)) | |