From 98c231f7a370a28c6e5ae7e26f56e6339b8d836f Mon Sep 17 00:00:00 2001 From: sirex Date: Thu, 26 May 2011 19:26:38 +0300 Subject: [PATCH] Added Lithuanian numbers support. --- .hgignore | 3 + num2word_LT.py | 175 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 178 insertions(+) create mode 100644 .hgignore create mode 100644 num2word_LT.py diff --git a/.hgignore b/.hgignore new file mode 100644 index 0000000..bb6d589 --- /dev/null +++ b/.hgignore @@ -0,0 +1,3 @@ +syntax: glob + +*.pyc diff --git a/num2word_LT.py b/num2word_LT.py new file mode 100644 index 0000000..3d86cd6 --- /dev/null +++ b/num2word_LT.py @@ -0,0 +1,175 @@ +# -*- encoding: utf-8 -*- +""" +>>> ' '.join([str(i) for i in splitby3('1')]) +'1' +>>> ' '.join([str(i) for i in splitby3('1123')]) +'1 123' +>>> ' '.join([str(i) for i in splitby3('1234567890')]) +'1 234 567 890' + +>>> ' '.join([n2w(i) for i in range(10)]) +u'nulis vienas du trys keturi penki \u0161e\u0161i septyni a\u0161tuoni devyni' +>>> ' '.join([n2w(i+10) for i in range(10)]) +u'de\u0161imt vienuolika dvylika trylika keturiolika penkiolika \u0161e\u0161iolika septiniolika a\u0161tuoniolika devyniolika' +>>> ' '.join([n2w(i*10) for i in range(10)]) +u'nulis de\u0161imt dvide\u0161imt trisde\u0161imt keturiasde\u0161imt penkiasde\u0161imt \u0161e\u0161iasde\u0161imt septyniasde\u0161imt a\u0161tuoniasde\u0161imt devyniasde\u0161imt' + +>>> n2w(123) +u'\u0161imtas dvide\u0161imt trys' +>>> n2w(100) +u'\u0161imtas' +>>> n2w(101) +u'\u0161imtas vienas' +>>> n2w(110) +u'\u0161imtas de\u0161imt' +>>> n2w(115) +u'\u0161imtas penkiolika' +>>> n2w(1000) +u't\u016bkstantis' +>>> n2w(1001) +u't\u016bkstantis vienas' +>>> n2w(2012) +u'du t\u016bkstan\u010diai dvylika' +>>> n2w(1234567890) +u'milijardas du \u0161imtai trisde\u0161imt keturi milijonai penki \u0161imtai \u0161e\u0161iasde\u0161imt septyni t\u016bkstan\u010diai a\u0161tuoni \u0161imtai devyniasde\u0161imt' + +#>>> to_currency(1234.56, 'LTL') + +""" + +ZERO = (u'nulis',) + +ONES = { + 1: (u'vienas',), + 2: (u'du',), + 3: (u'trys',), + 4: (u'keturi',), + 5: (u'penki',), + 6: (u'šeši',), + 7: (u'septyni',), + 8: (u'aštuoni',), + 9: (u'devyni',), +} + +TENS = { + 0: (u'dešimt',), + 1: (u'vienuolika',), + 2: (u'dvylika',), + 3: (u'trylika',), + 4: (u'keturiolika',), + 5: (u'penkiolika',), + 6: (u'šešiolika',), + 7: (u'septiniolika',), + 8: (u'aštuoniolika',), + 9: (u'devyniolika',), +} + +TWENTIES = { + 2: (u'dvidešimt',), + 3: (u'trisdešimt',), + 4: (u'keturiasdešimt',), + 5: (u'penkiasdešimt',), + 6: (u'šešiasdešimt',), + 7: (u'septyniasdešimt',), + 8: (u'aštuoniasdešimt',), + 9: (u'devyniasdešimt',), +} + +HUNDRED = (u'šimtas', u'šimtai') + +THOUSANDS = { + 1: (u'tūkstantis', u'tūkstančiai', u'tūkstančių'), + 2: (u'milijonas', u'milijonai', u'milijonų'), + 3: (u'milijardas', u'milijardai', u'milijardų'), + 4: (u'trilijonas', u'trilijonai', u'trilijonų'), + 5: (u'kvadrilijonas', u'kvadrilijonai', u'kvadrilijonų'), + 6: (u'kvintilijonas', u'kvintilijonai', u'kvintilijonų'), + 7: (u'sikstilijonas', u'sikstilijonai', u'sikstilijonų'), + 8: (u'septilijonas', u'septilijonai', u'septilijonų'), + 9: (u'oktilijonas', u'oktilijonai', u'oktilijonų'), + 10: (u'naintilijonas', u'naintilijonai', u'naintilijonų'), +} + +CURRENCIES = { + 'LTL': (('litas', 'litai', 'litų'), ('centas', 'centai', 'centų')), +} + +def splitby3(n): + length = len(n) + if length > 3: + start = length % 3 + if start > 0: + yield int(n[:start]) + for i in range(start, length, 3): + yield int(n[i:i+3]) + else: + yield int(n) + + +def get_digits(n): + n1 = n2 = n3 = 0 + if n > 99: + n3 = (n % 1000)//100 + if n > 9: + n2 = (n % 100)//10 + n1 = n % 10 + return (n1, n2, n3) + + +def int2word(n): + if n == 0: + return ZERO[0] + + words = [] + chunks = list(splitby3(str(n))) + i = len(chunks) + for x in chunks: + i -= 1 + n1, n2, n3 = get_digits(x) + + if n3 > 0: + if n3 > 1: + words.append(ONES[n3][0]) + words.append(HUNDRED[1]) + else: + words.append(HUNDRED[0]) + + if n2 > 1: + words.append(TWENTIES[n2][0]) + + if n2 == 1: + words.append(TENS[n1][0]) + elif n1 > 0 and not (i > 0 and n1 == 1): + words.append(ONES[n1][0]) + + if i > 0: + if n1 == 1 and n2 != 1: + words.append(THOUSANDS[i][0]) + elif n1 > 1: + words.append(THOUSANDS[i][1]) + else: + words.append(THOUSANDS[i][2]) + + return ' '.join(words) + +def n2w(n): + n = str(n).replace(',', '.') + if '.' in n: + left, right = n.split('.') + return u'%s kablelis %s' % (int2word(int(left)), int2word(int(right))) + else: + return int2word(int(n)) + +def to_currency(n, currency='LTL'): + n = str(n).replace(',', '.') + if '.' in n: + left, right = n.split('.') + else: + left, right = n, 0 + left, right = int(left), int(right) + return u'%s kablelis %s' % (int2word(left), int2word(right)) + + +if __name__ == '__main__': + import doctest + doctest.testmod()