import unittest # pagal https://gist.github.com/evaqas/63fa204e3a1f0019bce2 def skaicius_zodziais(skaicius): skaicius = int(skaicius) # neskaiciuosim neigiamu ir itin dideliu skaiciu (iki milijardu) if skaicius < 0 or skaicius >= 10 ** 9: return skaicius = str(skaicius) if skaicius == 0: return 'nulis' vienetai = ['', 'vienas', 'du', 'trys', 'keturi', 'penki', 'šeši', 'septyni', 'aštuoni', 'devyni'] niolikai = ['', 'vienuolika', 'dvylika', 'trylika', 'keturiolika', 'penkiolika', 'šešiolika', 'septyniolika', 'aštuoniolika', 'devyniolika'] desimtys = ['', 'dešimt', 'dvidešimt', 'trisdešimt', 'keturiasdešimt', 'penkiasdešimt', 'šešiasdešimt', 'septyniasdešimt', 'aštuoniasdešimt', 'devyniasdešimt'] pavadinimai = [ ['milijonas', 'milijonai', 'milijonų'], ['tūkstantis', 'tūkstančiai', 'tūkstančių'], ] skaicius = '%09d' % int(skaicius) # iki milijardu 10^9 (milijardu neskaiciuosim) skaicius = [skaicius[i:i + 3] for i in range(0, len(skaicius), 3)] zodziais = [] for i, tripletas in enumerate(skaicius): # resetinam linksni linksnis = 0 simtai = int(tripletas) // 100 # pridedam simtu pavadinima, jei pirmas tripleto skaitmuo > 0 if simtai > 0: if simtai > 1: zodziais += [vienetai[simtai]] zodziais += ['šimtai' if (simtai > 1) else 'šimtas'] # du paskutiniai tripleto skaiciai du = int(tripletas) % 100 des = du // 10 vie = du % 10 # pacekinam nioliktus skaicius if 10 < du < 20: zodziais += [niolikai[vie]] linksnis = 2 else: # pacekinam desimtis if des > 0: zodziais += [desimtys[des]] # pridedam vienetus if vie > 0: zodziais += [vienetai[vie]] linksnis = 1 if (vie > 1) else 0 else: linksnis = 2 # pridedam pavadinima isskyrus paskutiniam ir nuliniams tripletams if i < len(pavadinimai) and tripletas != '000': pavadinimas_2 = pavadinimai[i][linksnis] zodziais += [pavadinimas_2] number = " ".join(zodziais).strip() number = number.replace(" ", " ") return number class TestNumberConversion(unittest.TestCase): def test_10(self): self.assertEqual('dešimt', skaicius_zodziais(10)) def test_55(self): self.assertEqual('penkiasdešimt penki', skaicius_zodziais(55)) def test_20(self): self.assertEqual('dvidešimt', skaicius_zodziais(20)) def test_11(self): self.assertEqual('vienuolika', skaicius_zodziais(11)) def test_121(self): self.assertEqual('šimtas dvidešimt vienas', skaicius_zodziais(121)) def test_2515(self): self.assertEqual('du tūkstančiai penki šimtai penkiolika', skaicius_zodziais(2515)) def test_45000(self): self.assertEqual('keturiasdešimt penki tūkstančiai', skaicius_zodziais(45000)) def test_450000(self): self.assertEqual('keturi šimtai penkiasdešimt tūkstančių', skaicius_zodziais(450000)) if __name__ == '__main__': unittest.main()