Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Marek Madejski
2018-12-28 11:14:26 +01:00
72 changed files with 1664 additions and 1423 deletions

View File

@@ -46,8 +46,6 @@ Command line::
$ num2words 10001 $ num2words 10001
ten thousand and one ten thousand and one
$ num2words 10123123 --lang es
diez millones ciento veintitrés mil ciento veintitrés
$ num2words 24,120.10 $ num2words 24,120.10
twenty-four thousand, one hundred and twenty point one twenty-four thousand, one hundred and twenty point one
$ num2words 24,120.10 -l es $ num2words 24,120.10 -l es

View File

@@ -1,5 +1,21 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA
"""num2words: convert numbers into words. """num2words: convert numbers into words.
Usage: Usage:
@@ -22,9 +38,6 @@ Options:
Examples: Examples:
$ num2words 10001 $ num2words 10001
ten thousand and one ten thousand and one
$ num2words 10123123 --lang es
diez millones ciento veintitrés mil ciento veintitrés
$ num2words 24,120.10 $ num2words 24,120.10
twenty-four thousand, one hundred and twenty point one twenty-four thousand, one hundred and twenty point one
@@ -35,6 +48,7 @@ Examples:
$num2words 2.14 -l es --to currency $num2words 2.14 -l es --to currency
dos euros con catorce centimos dos euros con catorce centimos
""" """
from __future__ import print_function, unicode_literals from __future__ import print_function, unicode_literals
import os import os
import sys import sys

7
docker-compose.yml Normal file
View File

@@ -0,0 +1,7 @@
version: '3.0'
services:
web:
image: python:3-alpine
command: python3 -m http.server 8080
volumes:
- .:/num2words

View File

@@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.

View File

@@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.

View File

@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2016, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public

View File

@@ -1,3 +1,20 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA
from __future__ import division from __future__ import division
from decimal import ROUND_HALF_UP, Decimal from decimal import ROUND_HALF_UP, Decimal

View File

@@ -1,4 +1,4 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
@@ -14,6 +14,7 @@
# License along with this library; if not, write to the Free Software # License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA # MA 02110-1301 USA
from __future__ import unicode_literals from __future__ import unicode_literals
from .base import Num2Word_Base from .base import Num2Word_Base
@@ -130,6 +131,10 @@ class Num2Word_CZ(Num2Word_Base):
i = len(chunks) i = len(chunks)
for x in chunks: for x in chunks:
i -= 1 i -= 1
if x == 0:
continue
n1, n2, n3 = get_digits(x) n1, n2, n3 = get_digits(x)
if n3 > 0: if n3 > 0:

View File

@@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.

View File

@@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.

View File

@@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.

View File

@@ -1,5 +1,4 @@
# encoding: UTF-8 # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.

View File

@@ -1,5 +1,4 @@
# encoding: UTF-8 # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.

View File

@@ -1,5 +1,4 @@
# encoding: UTF-8 # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.

View File

@@ -1,4 +1,4 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.

View File

@@ -1,4 +1,4 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.

View File

@@ -1,4 +1,4 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.

View File

@@ -1,4 +1,4 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
@@ -14,7 +14,6 @@
# License along with this library; if not, write to the Free Software # License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA # MA 02110-1301 USA
from __future__ import print_function, unicode_literals from __future__ import print_function, unicode_literals
from .lang_FR import Num2Word_FR from .lang_FR import Num2Word_FR

View File

@@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.

View File

@@ -1,148 +1,150 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either # License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version. # version 2.1 of the License, or (at your option) any later version.
# This library is distributed in the hope that it will be useful, # This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details. # Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public # You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software # License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA # MA 02110-1301 USA
from __future__ import print_function, unicode_literals from __future__ import print_function, unicode_literals
from .utils import get_digits, splitbyx from .utils import get_digits, splitbyx
ZERO = (u'אפס',) ZERO = (u'אפס',)
ONES = { ONES = {
1: (u'אחד',), 1: (u'אחד',),
2: (u'שנים',), 2: (u'שנים',),
3: (u'שלש',), 3: (u'שלש',),
4: (u'ארבע',), 4: (u'ארבע',),
5: (u'חמש',), 5: (u'חמש',),
6: (u'שש',), 6: (u'שש',),
7: (u'שבע',), 7: (u'שבע',),
8: (u'שמנה',), 8: (u'שמנה',),
9: (u'תשע',), 9: (u'תשע',),
} }
TENS = { TENS = {
0: (u'עשר',), 0: (u'עשר',),
1: (u'אחד עשרה',), 1: (u'אחד עשרה',),
2: (u'שנים עשרה',), 2: (u'שנים עשרה',),
3: (u'שלש עשרה',), 3: (u'שלש עשרה',),
4: (u'ארבע עשרה',), 4: (u'ארבע עשרה',),
5: (u'חמש עשרה',), 5: (u'חמש עשרה',),
6: (u'שש עשרה',), 6: (u'שש עשרה',),
7: (u'שבע עשרה',), 7: (u'שבע עשרה',),
8: (u'שמנה עשרה',), 8: (u'שמנה עשרה',),
9: (u'תשע עשרה',), 9: (u'תשע עשרה',),
} }
TWENTIES = { TWENTIES = {
2: (u'עשרים',), 2: (u'עשרים',),
3: (u'שלשים',), 3: (u'שלשים',),
4: (u'ארבעים',), 4: (u'ארבעים',),
5: (u'חמישים',), 5: (u'חמישים',),
6: (u'ששים',), 6: (u'ששים',),
7: (u'שבעים',), 7: (u'שבעים',),
8: (u'שמנים',), 8: (u'שמנים',),
9: (u'תשעים',), 9: (u'תשעים',),
} }
HUNDRED = { HUNDRED = {
1: (u'מאה',), 1: (u'מאה',),
2: (u'מאתיים',), 2: (u'מאתיים',),
3: (u'מאות',) 3: (u'מאות',)
} }
THOUSANDS = { THOUSANDS = {
1: (u'אלף',), 1: (u'אלף',),
2: (u'אלפיים',), 2: (u'אלפיים',),
} }
AND = u'ו' AND = u'ו'
def pluralize(n, forms): def pluralize(n, forms):
# gettext implementation: # gettext implementation:
# (n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2) # (n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2)
form = 0 if (n % 10 == 1 and n % 100 != 11) else 1 if n != 0 else 2 form = 0 if (n % 10 == 1 and n % 100 != 11) else 1 if n != 0 else 2
return forms[form] return forms[form]
def int2word(n): def int2word(n):
if n > 9999: # doesn't yet work for numbers this big if n > 9999: # doesn't yet work for numbers this big
raise NotImplementedError() raise NotImplementedError()
if n == 0: if n == 0:
return ZERO[0] return ZERO[0]
words = [] words = []
chunks = list(splitbyx(str(n), 3)) chunks = list(splitbyx(str(n), 3))
i = len(chunks) i = len(chunks)
for x in chunks: for x in chunks:
i -= 1 i -= 1
n1, n2, n3 = get_digits(x)
if x == 0:
# print str(n3) + str(n2) + str(n1) continue
if n3 > 0: n1, n2, n3 = get_digits(x)
if n3 <= 2:
words.append(HUNDRED[n3][0]) if n3 > 0:
else: if n3 <= 2:
words.append(ONES[n3][0]) words.append(HUNDRED[n3][0])
words.append(HUNDRED[3][0]) else:
words.append(ONES[n3][0])
if n2 > 1: words.append(HUNDRED[3][0])
words.append(TWENTIES[n2][0])
if n2 > 1:
if n2 == 1: words.append(TWENTIES[n2][0])
words.append(TENS[n1][0])
elif n1 > 0 and not (i > 0 and x == 1): if n2 == 1:
words.append(ONES[n1][0]) words.append(TENS[n1][0])
elif n1 > 0 and not (i > 0 and x == 1):
if i > 0: words.append(ONES[n1][0])
if i <= 2:
words.append(THOUSANDS[i][0]) if i > 0:
else: if i <= 2:
words.append(ONES[i][0]) words.append(THOUSANDS[i][0])
words.append(THOUSANDS[1][0]) else:
words.append(ONES[i][0])
if len(words) > 1: words.append(THOUSANDS[1][0])
words[-1] = AND + words[-1]
return ' '.join(words) if len(words) > 1:
words[-1] = AND + words[-1]
return ' '.join(words)
def n2w(n):
return int2word(int(n))
def n2w(n):
return int2word(int(n))
def to_currency(n, currency='EUR', cents=True, seperator=','):
raise NotImplementedError()
def to_currency(n, currency='EUR', cents=True, seperator=','):
raise NotImplementedError()
class Num2Word_HE(object):
def to_cardinal(self, number):
return n2w(number) class Num2Word_HE(object):
def to_cardinal(self, number):
def to_ordinal(self, number): return n2w(number)
raise NotImplementedError()
def to_ordinal(self, number):
raise NotImplementedError()
if __name__ == '__main__':
yo = Num2Word_HE()
nums = [1, 11, 21, 24, 99, 100, 101, 200, 211, 345, 1000, 1011] if __name__ == '__main__':
for num in nums: yo = Num2Word_HE()
print(num, yo.to_cardinal(num)) nums = [1, 11, 21, 24, 99, 100, 101, 200, 211, 345, 1000, 1011]
for num in nums:
print(num, yo.to_cardinal(num))

View File

@@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.

View File

@@ -1,5 +1,7 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either # License as published by the Free Software Foundation; either

View File

@@ -1,175 +1,179 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either # License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version. # version 2.1 of the License, or (at your option) any later version.
# This library is distributed in the hope that it will be useful, # This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details. # Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public # You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software # License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA # MA 02110-1301 USA
# TODO: replace WINDOWS line endings to UNIX?
from __future__ import unicode_literals from __future__ import unicode_literals
from .base import Num2Word_Base from .base import Num2Word_Base
from .utils import get_digits, splitbyx from .utils import get_digits, splitbyx
ZERO = ('nulis',) ZERO = ('nulis',)
ONES_FEMININE = { ONES_FEMININE = {
1: ('viena',), 1: ('viena',),
2: ('dvi',), 2: ('dvi',),
3: ('trys',), 3: ('trys',),
4: ('keturios',), 4: ('keturios',),
5: ('penkios',), 5: ('penkios',),
6: ('šešios',), 6: ('šešios',),
7: ('septynios',), 7: ('septynios',),
8: ('aštuonios',), 8: ('aštuonios',),
9: ('devynios',), 9: ('devynios',),
} }
ONES = { ONES = {
1: ('vienas',), 1: ('vienas',),
2: ('du',), 2: ('du',),
3: ('trys',), 3: ('trys',),
4: ('keturi',), 4: ('keturi',),
5: ('penki',), 5: ('penki',),
6: ('šeši',), 6: ('šeši',),
7: ('septyni',), 7: ('septyni',),
8: ('aštuoni',), 8: ('aštuoni',),
9: ('devyni',), 9: ('devyni',),
} }
TENS = { TENS = {
0: ('dešimt',), 0: ('dešimt',),
1: ('vienuolika',), 1: ('vienuolika',),
2: ('dvylika',), 2: ('dvylika',),
3: ('trylika',), 3: ('trylika',),
4: ('keturiolika',), 4: ('keturiolika',),
5: ('penkiolika',), 5: ('penkiolika',),
6: ('šešiolika',), 6: ('šešiolika',),
7: ('septyniolika',), 7: ('septyniolika',),
8: ('aštuoniolika',), 8: ('aštuoniolika',),
9: ('devyniolika',), 9: ('devyniolika',),
} }
TWENTIES = { TWENTIES = {
2: ('dvidešimt',), 2: ('dvidešimt',),
3: ('trisdešimt',), 3: ('trisdešimt',),
4: ('keturiasdešimt',), 4: ('keturiasdešimt',),
5: ('penkiasdešimt',), 5: ('penkiasdešimt',),
6: ('šešiasdešimt',), 6: ('šešiasdešimt',),
7: ('septyniasdešimt',), 7: ('septyniasdešimt',),
8: ('aštuoniasdešimt',), 8: ('aštuoniasdešimt',),
9: ('devyniasdešimt',), 9: ('devyniasdešimt',),
} }
HUNDRED = ('šimtas', 'šimtai') HUNDRED = ('šimtas', 'šimtai')
THOUSANDS = { THOUSANDS = {
1: ('tūkstantis', 'tūkstančiai', 'tūkstančių'), 1: ('tūkstantis', 'tūkstančiai', 'tūkstančių'),
2: ('milijonas', 'milijonai', 'milijonų'), 2: ('milijonas', 'milijonai', 'milijonų'),
3: ('milijardas', 'milijardai', 'milijardų'), 3: ('milijardas', 'milijardai', 'milijardų'),
4: ('trilijonas', 'trilijonai', 'trilijonų'), 4: ('trilijonas', 'trilijonai', 'trilijonų'),
5: ('kvadrilijonas', 'kvadrilijonai', 'kvadrilijonų'), 5: ('kvadrilijonas', 'kvadrilijonai', 'kvadrilijonų'),
6: ('kvintilijonas', 'kvintilijonai', 'kvintilijonų'), 6: ('kvintilijonas', 'kvintilijonai', 'kvintilijonų'),
7: ('sikstilijonas', 'sikstilijonai', 'sikstilijonų'), 7: ('sikstilijonas', 'sikstilijonai', 'sikstilijonų'),
8: ('septilijonas', 'septilijonai', 'septilijonų'), 8: ('septilijonas', 'septilijonai', 'septilijonų'),
9: ('oktilijonas', 'oktilijonai', 'oktilijonų'), 9: ('oktilijonas', 'oktilijonai', 'oktilijonų'),
10: ('naintilijonas', 'naintilijonai', 'naintilijonų'), 10: ('naintilijonas', 'naintilijonai', 'naintilijonų'),
} }
GENERIC_CENTS = ('centas', 'centai', 'centų') GENERIC_CENTS = ('centas', 'centai', 'centų')
class Num2Word_LT(Num2Word_Base): class Num2Word_LT(Num2Word_Base):
CURRENCY_FORMS = { CURRENCY_FORMS = {
'LTL': (('litas', 'litai', 'litų'), GENERIC_CENTS), 'LTL': (('litas', 'litai', 'litų'), GENERIC_CENTS),
'EUR': (('euras', 'eurai', 'eurų'), GENERIC_CENTS), 'EUR': (('euras', 'eurai', 'eurų'), GENERIC_CENTS),
'USD': (('doleris', 'doleriai', 'dolerių'), GENERIC_CENTS), 'USD': (('doleris', 'doleriai', 'dolerių'), GENERIC_CENTS),
'GBP': ( 'GBP': (
('svaras sterlingų', 'svarai sterlingų', 'svarų sterlingų'), ('svaras sterlingų', 'svarai sterlingų', 'svarų sterlingų'),
('pensas', 'pensai', 'pensų') ('pensas', 'pensai', 'pensų')
), ),
'PLN': ( 'PLN': (
('zlotas', 'zlotai', 'zlotų'), ('zlotas', 'zlotai', 'zlotų'),
('grašis', 'grašiai', 'grašių')), ('grašis', 'grašiai', 'grašių')),
'RUB': ( 'RUB': (
('rublis', 'rubliai', 'rublių'), ('rublis', 'rubliai', 'rublių'),
('kapeika', 'kapeikos', 'kapeikų') ('kapeika', 'kapeikos', 'kapeikų')
), ),
} }
def setup(self): def setup(self):
self.negword = "minus" self.negword = "minus"
self.pointword = "kablelis" self.pointword = "kablelis"
def pluralize(self, n, forms): def pluralize(self, n, forms):
n1, n2, n3 = get_digits(n) n1, n2, n3 = get_digits(n)
if n2 == 1 or n1 == 0 or n == 0: if n2 == 1 or n1 == 0 or n == 0:
return forms[2] return forms[2]
elif n1 == 1: elif n1 == 1:
return forms[0] return forms[0]
else: else:
return forms[1] return forms[1]
def to_cardinal(self, number): def to_cardinal(self, number):
n = str(number).replace(',', '.') n = str(number).replace(',', '.')
base_str, n = self.parse_minus(n) base_str, n = self.parse_minus(n)
if '.' in n: if '.' in n:
left, right = n.split('.') left, right = n.split('.')
return '%s%s %s %s' % ( return '%s%s %s %s' % (
base_str, base_str,
self._int2word(int(left)), self._int2word(int(left)),
self.pointword, self.pointword,
self._int2word(int(right)) self._int2word(int(right))
) )
else: else:
return "%s%s" % (base_str, self._int2word(int(n))) return "%s%s" % (base_str, self._int2word(int(n)))
def to_ordinal(self, number): def to_ordinal(self, number):
raise NotImplementedError() raise NotImplementedError()
def _cents_verbose(self, number, currency): def _cents_verbose(self, number, currency):
return self._int2word(number, currency == 'RUB') return self._int2word(number, currency == 'RUB')
def _int2word(self, n, feminine=False): def _int2word(self, n, feminine=False):
if n == 0: if n == 0:
return ZERO[0] return ZERO[0]
words = [] words = []
chunks = list(splitbyx(str(n), 3)) chunks = list(splitbyx(str(n), 3))
i = len(chunks) i = len(chunks)
for x in chunks: for x in chunks:
i -= 1 i -= 1
n1, n2, n3 = get_digits(x)
if x == 0:
if n3 > 0: continue
words.append(ONES[n3][0])
if n3 > 1: n1, n2, n3 = get_digits(x)
words.append(HUNDRED[1])
else: if n3 > 0:
words.append(HUNDRED[0]) words.append(ONES[n3][0])
if n3 > 1:
if n2 > 1: words.append(HUNDRED[1])
words.append(TWENTIES[n2][0]) else:
words.append(HUNDRED[0])
if n2 == 1:
words.append(TENS[n1][0]) if n2 > 1:
elif n1 > 0: words.append(TWENTIES[n2][0])
if (i == 1 or feminine and i == 0) and n < 1000:
words.append(ONES_FEMININE[n1][0]) if n2 == 1:
else: words.append(TENS[n1][0])
words.append(ONES[n1][0]) elif n1 > 0:
if (i == 1 or feminine and i == 0) and n < 1000:
if i > 0: words.append(ONES_FEMININE[n1][0])
words.append(self.pluralize(x, THOUSANDS[i])) else:
words.append(ONES[n1][0])
return ' '.join(words)
if i > 0:
words.append(self.pluralize(x, THOUSANDS[i]))
return ' '.join(words)

View File

@@ -1,182 +1,186 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either # License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version. # version 2.1 of the License, or (at your option) any later version.
# This library is distributed in the hope that it will be useful, # This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details. # Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public # You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software # License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA # MA 02110-1301 USA
# TODO: replace WINDOWS line endings to UNIX?
from __future__ import unicode_literals from __future__ import unicode_literals
from .base import Num2Word_Base from .base import Num2Word_Base
from .utils import get_digits, splitbyx from .utils import get_digits, splitbyx
ZERO = ('nulle',) ZERO = ('nulle',)
ONES = { ONES = {
1: ('viens',), 1: ('viens',),
2: ('divi',), 2: ('divi',),
3: ('trīs',), 3: ('trīs',),
4: ('četri',), 4: ('četri',),
5: ('pieci',), 5: ('pieci',),
6: ('seši',), 6: ('seši',),
7: ('septiņi',), 7: ('septiņi',),
8: ('astoņi',), 8: ('astoņi',),
9: ('deviņi',), 9: ('deviņi',),
} }
TENS = { TENS = {
0: ('desmit',), 0: ('desmit',),
1: ('vienpadsmit',), 1: ('vienpadsmit',),
2: ('divpadsmit',), 2: ('divpadsmit',),
3: ('trīspadsmit',), 3: ('trīspadsmit',),
4: ('četrpadsmit',), 4: ('četrpadsmit',),
5: ('piecpadsmit',), 5: ('piecpadsmit',),
6: ('sešpadsmit',), 6: ('sešpadsmit',),
7: ('septiņpadsmit',), 7: ('septiņpadsmit',),
8: ('astoņpadsmit',), 8: ('astoņpadsmit',),
9: ('deviņpadsmit',), 9: ('deviņpadsmit',),
} }
TWENTIES = { TWENTIES = {
2: ('divdesmit',), 2: ('divdesmit',),
3: ('trīsdesmit',), 3: ('trīsdesmit',),
4: ('četrdesmit',), 4: ('četrdesmit',),
5: ('piecdesmit',), 5: ('piecdesmit',),
6: ('sešdesmit',), 6: ('sešdesmit',),
7: ('septiņdesmit',), 7: ('septiņdesmit',),
8: ('astoņdesmit',), 8: ('astoņdesmit',),
9: ('deviņdesmit',), 9: ('deviņdesmit',),
} }
HUNDRED = ('simts', 'simti', 'simtu') HUNDRED = ('simts', 'simti', 'simtu')
THOUSANDS = { THOUSANDS = {
1: ('tūkstotis', 'tūkstoši', 'tūkstošu'), 1: ('tūkstotis', 'tūkstoši', 'tūkstošu'),
2: ('miljons', 'miljoni', 'miljonu'), 2: ('miljons', 'miljoni', 'miljonu'),
3: ('miljards', 'miljardi', 'miljardu'), 3: ('miljards', 'miljardi', 'miljardu'),
4: ('triljons', 'triljoni', 'triljonu'), 4: ('triljons', 'triljoni', 'triljonu'),
5: ('kvadriljons', 'kvadriljoni', 'kvadriljonu'), 5: ('kvadriljons', 'kvadriljoni', 'kvadriljonu'),
6: ('kvintiljons', 'kvintiljoni', 'kvintiljonu'), 6: ('kvintiljons', 'kvintiljoni', 'kvintiljonu'),
7: ('sikstiljons', 'sikstiljoni', 'sikstiljonu'), 7: ('sikstiljons', 'sikstiljoni', 'sikstiljonu'),
8: ('septiljons', 'septiljoni', 'septiljonu'), 8: ('septiljons', 'septiljoni', 'septiljonu'),
9: ('oktiljons', 'oktiljoni', 'oktiljonu'), 9: ('oktiljons', 'oktiljoni', 'oktiljonu'),
10: ('nontiljons', 'nontiljoni', 'nontiljonu'), 10: ('nontiljons', 'nontiljoni', 'nontiljonu'),
} }
GENERIC_DOLLARS = ('dolārs', 'dolāri', 'dolāru') GENERIC_DOLLARS = ('dolārs', 'dolāri', 'dolāru')
GENERIC_CENTS = ('cents', 'centi', 'centu') GENERIC_CENTS = ('cents', 'centi', 'centu')
GENERIC_KRONA = ('krona', 'kronas', 'kronu') GENERIC_KRONA = ('krona', 'kronas', 'kronu')
GENERIC_ERA = ('ēre', 'ēras', 'ēru') GENERIC_ERA = ('ēre', 'ēras', 'ēru')
class Num2Word_LV(Num2Word_Base): class Num2Word_LV(Num2Word_Base):
""" """
Sadly we have a legal form (used in legal and finance documents): Sadly we have a legal form (used in legal and finance documents):
http://www.eiro.lv/files/upload/files/Eiro_rakstiba-1.pdf http://www.eiro.lv/files/upload/files/Eiro_rakstiba-1.pdf
https://likumi.lv/doc.php?id=254741 https://likumi.lv/doc.php?id=254741
http://eur-lex.europa.eu/legal-content/LV/TXT/HTML/?uri=CELEX:31998R0974&from=LV http://eur-lex.europa.eu/legal-content/LV/TXT/HTML/?uri=CELEX:31998R0974&from=LV
Source: http://publications.europa.eu/code/lv/lv-5000500.htm Source: http://publications.europa.eu/code/lv/lv-5000500.htm
""" """
CURRENCY_FORMS = { CURRENCY_FORMS = {
'AUD': (GENERIC_DOLLARS, GENERIC_CENTS), 'AUD': (GENERIC_DOLLARS, GENERIC_CENTS),
'CAD': (GENERIC_DOLLARS, GENERIC_CENTS), 'CAD': (GENERIC_DOLLARS, GENERIC_CENTS),
# repalced by EUR # repalced by EUR
'EEK': (GENERIC_KRONA, GENERIC_CENTS), 'EEK': (GENERIC_KRONA, GENERIC_CENTS),
'EUR': (('eiro', 'eiro', 'eiro'), GENERIC_CENTS), 'EUR': (('eiro', 'eiro', 'eiro'), GENERIC_CENTS),
'EUR_LEGAL': (('euro', 'euro', 'euro'), GENERIC_CENTS), 'EUR_LEGAL': (('euro', 'euro', 'euro'), GENERIC_CENTS),
'GBP': ( 'GBP': (
('sterliņu mārciņa', 'sterliņu mārciņas', 'sterliņu mārciņu'), ('sterliņu mārciņa', 'sterliņu mārciņas', 'sterliņu mārciņu'),
('penss', 'pensi', 'pensu')), ('penss', 'pensi', 'pensu')),
# replaced by EUR # replaced by EUR
'LTL': (('lits', 'liti', 'litu'), GENERIC_CENTS), 'LTL': (('lits', 'liti', 'litu'), GENERIC_CENTS),
# replaced by EUR # replaced by EUR
'LVL': (('lats', 'lati', 'latu'), 'LVL': (('lats', 'lati', 'latu'),
('santīms', 'santīmi', 'santīmu')), ('santīms', 'santīmi', 'santīmu')),
'USD': (GENERIC_DOLLARS, GENERIC_CENTS), 'USD': (GENERIC_DOLLARS, GENERIC_CENTS),
'RUB': (('rublis', 'rubļi', 'rubļu'), 'RUB': (('rublis', 'rubļi', 'rubļu'),
('kapeika', 'kapeikas', 'kapeiku')), ('kapeika', 'kapeikas', 'kapeiku')),
'SEK': (GENERIC_KRONA, GENERIC_ERA), 'SEK': (GENERIC_KRONA, GENERIC_ERA),
'NOK': (GENERIC_KRONA, GENERIC_ERA), 'NOK': (GENERIC_KRONA, GENERIC_ERA),
'PLN': (('zlots', 'zloti', 'zlotu'), 'PLN': (('zlots', 'zloti', 'zlotu'),
('grasis', 'graši', 'grašu')), ('grasis', 'graši', 'grašu')),
} }
CURRENCY_ADJECTIVES = { CURRENCY_ADJECTIVES = {
'AUD': 'Austrālijas', 'AUD': 'Austrālijas',
'CAD': 'Kanādas', 'CAD': 'Kanādas',
'EEK': 'Igaunijas', 'EEK': 'Igaunijas',
'USD': 'ASV', 'USD': 'ASV',
'RUB': 'Kreivijas', 'RUB': 'Kreivijas',
'SEK': 'Zviedrijas', 'SEK': 'Zviedrijas',
'NOK': 'Norvēģijas', 'NOK': 'Norvēģijas',
} }
def setup(self): def setup(self):
self.negword = "mīnus" self.negword = "mīnus"
self.pointword = "komats" self.pointword = "komats"
def to_cardinal(self, number): def to_cardinal(self, number):
n = str(number).replace(',', '.') n = str(number).replace(',', '.')
base_str, n = self.parse_minus(n) base_str, n = self.parse_minus(n)
if '.' in n: if '.' in n:
left, right = n.split('.') left, right = n.split('.')
return '%s%s %s %s' % ( return '%s%s %s %s' % (
base_str, base_str,
self._int2word(int(left)), self._int2word(int(left)),
self.pointword, self.pointword,
self._int2word(int(right)) self._int2word(int(right))
) )
else: else:
return "%s%s" % (base_str, self._int2word(int(n))) return "%s%s" % (base_str, self._int2word(int(n)))
def pluralize(self, n, forms): def pluralize(self, n, forms):
form = 0 if (n % 10 == 1 and n % 100 != 11) else 1 if n != 0 else 2 form = 0 if (n % 10 == 1 and n % 100 != 11) else 1 if n != 0 else 2
return forms[form] return forms[form]
def to_ordinal(self, number): def to_ordinal(self, number):
raise NotImplementedError() raise NotImplementedError()
def _int2word(self, n): def _int2word(self, n):
if n == 0: if n == 0:
return ZERO[0] return ZERO[0]
words = [] words = []
chunks = list(splitbyx(str(n), 3)) chunks = list(splitbyx(str(n), 3))
i = len(chunks) i = len(chunks)
for x in chunks: for x in chunks:
i -= 1 i -= 1
n1, n2, n3 = get_digits(x)
if x == 0:
if n3 > 0: continue
if n3 == 1 and n2 == 0 and n1 > 0:
words.append(HUNDRED[2]) n1, n2, n3 = get_digits(x)
elif n3 > 1:
words.append(ONES[n3][0]) if n3 > 0:
words.append(HUNDRED[1]) if n3 == 1 and n2 == 0 and n1 > 0:
else: words.append(HUNDRED[2])
words.append(HUNDRED[0]) elif n3 > 1:
words.append(ONES[n3][0])
if n2 > 1: words.append(HUNDRED[1])
words.append(TWENTIES[n2][0]) else:
words.append(HUNDRED[0])
if n2 == 1:
words.append(TENS[n1][0]) if n2 > 1:
elif n1 > 0 and not (i > 0 and x == 1): words.append(TWENTIES[n2][0])
words.append(ONES[n1][0])
if n2 == 1:
if i > 0 and x != 0: words.append(TENS[n1][0])
words.append(self.pluralize(x, THOUSANDS[i])) elif n1 > 0 and not (i > 0 and x == 1):
words.append(ONES[n1][0])
return ' '.join(words)
if i > 0:
words.append(self.pluralize(x, THOUSANDS[i]))
return ' '.join(words)

View File

@@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.

View File

@@ -1,4 +1,4 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
@@ -14,6 +14,7 @@
# License along with this library; if not, write to the Free Software # License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA # MA 02110-1301 USA
from __future__ import unicode_literals from __future__ import unicode_literals
from .base import Num2Word_Base from .base import Num2Word_Base
@@ -66,7 +67,7 @@ HUNDREDS = {
6: ('sześćset',), 6: ('sześćset',),
7: ('siedemset',), 7: ('siedemset',),
8: ('osiemset',), 8: ('osiemset',),
9: ('dziewęćset',), 9: ('dziewięćset',),
} }
THOUSANDS = { THOUSANDS = {
@@ -141,6 +142,10 @@ class Num2Word_PL(Num2Word_Base):
i = len(chunks) i = len(chunks)
for x in chunks: for x in chunks:
i -= 1 i -= 1
if x == 0:
continue
n1, n2, n3 = get_digits(x) n1, n2, n3 = get_digits(x)
if n3 > 0: if n3 > 0:

View File

@@ -1,5 +1,4 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.

View File

@@ -1,5 +1,4 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
@@ -15,7 +14,6 @@
# License along with this library; if not, write to the Free Software # License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA # MA 02110-1301 USA
from __future__ import division, unicode_literals from __future__ import division, unicode_literals
import re import re

View File

@@ -1,4 +1,4 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.

View File

@@ -1,229 +1,234 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either # License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version. # version 2.1 of the License, or (at your option) any later version.
# This library is distributed in the hope that it will be useful, # This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details. # Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public # You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software # License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA # MA 02110-1301 USA
from __future__ import unicode_literals
from __future__ import unicode_literals
from .base import Num2Word_Base
from .utils import get_digits, splitbyx from .base import Num2Word_Base
from .utils import get_digits, splitbyx
ZERO = ('ноль',)
ZERO = ('ноль',)
ONES_FEMININE = {
1: ('одна',), ONES_FEMININE = {
2: ('две',), 1: ('одна',),
3: ('три',), 2: ('две',),
4: ('четыре',), 3: ('три',),
5: ('пять',), 4: ('четыре',),
6: ('шесть',), 5: ('пять',),
7: ('семь',), 6: ('шесть',),
8: ('восемь',), 7: ('семь',),
9: ('девять',), 8: ('восемь',),
} 9: ('девять',),
}
ONES = {
1: ('один',), ONES = {
2: ('два',), 1: ('один',),
3: ('три',), 2: ('два',),
4: ('четыре',), 3: ('три',),
5: ('пять',), 4: ('четыре',),
6: ('шесть',), 5: ('пять',),
7: ('семь',), 6: ('шесть',),
8: ('восемь',), 7: ('семь',),
9: ('девять',), 8: ('восемь',),
} 9: ('девять',),
}
TENS = {
0: ('десять',), TENS = {
1: ('одиннадцать',), 0: ('десять',),
2: ('двенадцать',), 1: ('одиннадцать',),
3: ('тринадцать',), 2: ('двенадцать',),
4: ('четырнадцать',), 3: ('тринадцать',),
5: ('пятнадцать',), 4: ('четырнадцать',),
6: ('шестнадцать',), 5: ('пятнадцать',),
7: ('семнадцать',), 6: ('шестнадцать',),
8: ('восемнадцать',), 7: ('семнадцать',),
9: ('девятнадцать',), 8: ('восемнадцать',),
} 9: ('девятнадцать',),
}
TWENTIES = {
2: ('двадцать',), TWENTIES = {
3: ('тридцать',), 2: ('двадцать',),
4: ('сорок',), 3: ('тридцать',),
5: ('пятьдесят',), 4: ('сорок',),
6: ('шестьдесят',), 5: ('пятьдесят',),
7: ('семьдесят',), 6: ('шестьдесят',),
8: ('восемьдесят',), 7: ('семьдесят',),
9: ('девяносто',), 8: ('восемьдесят',),
} 9: ('девяносто',),
}
HUNDREDS = {
1: ('сто',), HUNDREDS = {
2: ('двести',), 1: ('сто',),
3: ('триста',), 2: ('двести',),
4: ('четыреста',), 3: ('триста',),
5: ('пятьсот',), 4: ('четыреста',),
6: ('шестьсот',), 5: ('пятьсот',),
7: ('семьсот',), 6: ('шестьсот',),
8: ('восемьсот',), 7: ('семьсот',),
9: ('девятьсот',), 8: ('восемьсот',),
} 9: ('девятьсот',),
}
THOUSANDS = {
1: ('тысяча', 'тысячи', 'тысяч'), # 10^3 THOUSANDS = {
2: ('миллион', 'миллиона', 'миллионов'), # 10^6 1: ('тысяча', 'тысячи', 'тысяч'), # 10^3
3: ('миллиард', 'миллиарда', 'миллиардов'), # 10^9 2: ('миллион', 'миллиона', 'миллионов'), # 10^6
4: ('триллион', 'триллиона', 'триллионов'), # 10^12 3: ('миллиард', 'миллиарда', 'миллиардов'), # 10^9
5: ('квадриллион', 'квадриллиона', 'квадриллионов'), # 10^15 4: ('триллион', 'триллиона', 'триллионов'), # 10^12
6: ('квинтиллион', 'квинтиллиона', 'квинтиллионов'), # 10^18 5: ('квадриллион', 'квадриллиона', 'квадриллионов'), # 10^15
7: ('секстиллион', 'секстиллиона', 'секстиллионов'), # 10^21 6: ('квинтиллион', 'квинтиллиона', 'квинтиллионов'), # 10^18
8: ('септиллион', 'септиллиона', 'септиллионов'), # 10^24 7: ('секстиллион', 'секстиллиона', 'секстиллионов'), # 10^21
9: ('октиллион', 'октиллиона', 'октиллионов'), # 10^27 8: ('септиллион', 'септиллиона', 'септиллионов'), # 10^24
10: ('нониллион', 'нониллиона', 'нониллионов'), # 10^30 9: ('октиллион', 'октиллиона', 'октиллионов'), # 10^27
} 10: ('нониллион', 'нониллиона', 'нониллионов'), # 10^30
}
class Num2Word_RU(Num2Word_Base):
CURRENCY_FORMS = { class Num2Word_RU(Num2Word_Base):
'RUB': ( CURRENCY_FORMS = {
('рубль', 'рубля', 'рублей'), ('копейка', 'копейки', 'копеек') 'RUB': (
), ('рубль', 'рубля', 'рублей'), ('копейка', 'копейки', 'копеек')
'EUR': ( ),
('евро', 'евро', 'евро'), ('цент', 'цента', 'центов') 'EUR': (
), ('евро', 'евро', 'евро'), ('цент', 'цента', 'центов')
'USD': ( ),
('доллар', 'доллара', 'долларов'), ('цент', 'цента', 'центов') 'USD': (
), ('доллар', 'доллара', 'долларов'), ('цент', 'цента', 'центов')
} ),
}
def setup(self):
self.negword = "минус" def setup(self):
self.pointword = "запятая" self.negword = "минус"
self.ords = {"ноль": "нулевой", self.pointword = "запятая"
"один": "первый", self.ords = {"ноль": "нулевой",
"два": "второй", "один": "первый",
"три": "третий", "два": "второй",
"четыре": "четвертый", "три": "третий",
"пять": "пятый", "четыре": "четвертый",
"шесть": "шестой", "пять": "пятый",
"семь": "седьмой", "шесть": "шестой",
"восемь": "восьмой", "семь": "седьмой",
"девять": "девятый", "восемь": "восьмой",
"сто": "сотый"} "девять": "девятый",
self.ords_feminine = {"один": "", "сто": "сотый"}
"одна": "", self.ords_feminine = {"один": "",
"две": "двух", "одна": "",
"три": "трёх", "две": "двух",
"четыре": "четырёх", "три": "трёх",
"пять": "пяти", "четыре": "четырёх",
"шесть": "шести", "пять": "пяти",
"семь": "семи", "шесть": "шести",
"восемь": "восьми", "семь": "семи",
"девять": "девяти"} "восемь": "восьми",
"девять": "девяти"}
def to_cardinal(self, number):
n = str(number).replace(',', '.') def to_cardinal(self, number):
if '.' in n: n = str(number).replace(',', '.')
left, right = n.split('.') if '.' in n:
return u'%s %s %s' % ( left, right = n.split('.')
self._int2word(int(left)), return u'%s %s %s' % (
self.pointword, self._int2word(int(left)),
self._int2word(int(right)) self.pointword,
) self._int2word(int(right))
else: )
return self._int2word(int(n)) else:
return self._int2word(int(n))
def pluralize(self, n, forms):
if n % 100 < 10 or n % 100 > 20: def pluralize(self, n, forms):
if n % 10 == 1: if n % 100 < 10 or n % 100 > 20:
form = 0 if n % 10 == 1:
elif 5 > n % 10 > 1: form = 0
form = 1 elif 5 > n % 10 > 1:
else: form = 1
form = 2 else:
else: form = 2
form = 2 else:
return forms[form] form = 2
return forms[form]
def to_ordinal(self, number):
self.verify_ordinal(number) def to_ordinal(self, number):
outwords = self.to_cardinal(number).split(" ") self.verify_ordinal(number)
lastword = outwords[-1].lower() outwords = self.to_cardinal(number).split(" ")
try: lastword = outwords[-1].lower()
if len(outwords) > 1: try:
if outwords[-2] in self.ords_feminine: if len(outwords) > 1:
outwords[-2] = self.ords_feminine.get( if outwords[-2] in self.ords_feminine:
outwords[-2], outwords[-2]) outwords[-2] = self.ords_feminine.get(
elif outwords[-2] == 'десять': outwords[-2], outwords[-2])
outwords[-2] = outwords[-2][:-1] + 'и' elif outwords[-2] == 'десять':
if len(outwords) == 3: outwords[-2] = outwords[-2][:-1] + 'и'
if outwords[-3] in ['один', 'одна']: if len(outwords) == 3:
outwords[-3] = '' if outwords[-3] in ['один', 'одна']:
lastword = self.ords[lastword] outwords[-3] = ''
except KeyError: lastword = self.ords[lastword]
if lastword[:-3] in self.ords_feminine: except KeyError:
lastword = self.ords_feminine.get( if lastword[:-3] in self.ords_feminine:
lastword[:-3], lastword) + "сотый" lastword = self.ords_feminine.get(
elif lastword[-1] == "ь" or lastword[-2] == "т": lastword[:-3], lastword) + "сотый"
lastword = lastword[:-1] + "ый" elif lastword[-1] == "ь" or lastword[-2] == "т":
elif lastword[-1] == "к": lastword = lastword[:-1] + "ый"
lastword = lastword + "овой" elif lastword[-1] == "к":
elif lastword[-5:] == "десят": lastword = lastword + "овой"
lastword = lastword.replace('ь', 'и') + 'ый' elif lastword[-5:] == "десят":
elif lastword[-2] == "ч" or lastword[-1] == "ч": lastword = lastword.replace('ь', 'и') + 'ый'
if lastword[-2] == "ч": elif lastword[-2] == "ч" or lastword[-1] == "ч":
lastword = lastword[:-1] + "ный" if lastword[-2] == "ч":
if lastword[-1] == "ч": lastword = lastword[:-1] + "ный"
lastword = lastword + "ный" if lastword[-1] == "ч":
elif lastword[-1] == "н" or lastword[-2] == "н": lastword = lastword + "ный"
lastword = lastword[:lastword.rfind('н') + 1] + "ный" elif lastword[-1] == "н" or lastword[-2] == "н":
elif lastword[-1] == "д" or lastword[-2] == "д": lastword = lastword[:lastword.rfind('н') + 1] + "ный"
lastword = lastword[:lastword.rfind('д') + 1] + "ный" elif lastword[-1] == "д" or lastword[-2] == "д":
outwords[-1] = self.title(lastword) lastword = lastword[:lastword.rfind('д') + 1] + "ный"
return " ".join(outwords).strip() outwords[-1] = self.title(lastword)
return " ".join(outwords).strip()
def _cents_verbose(self, number, currency):
return self._int2word(number, currency == 'RUB') def _cents_verbose(self, number, currency):
return self._int2word(number, currency == 'RUB')
def _int2word(self, n, feminine=False):
if n < 0: def _int2word(self, n, feminine=False):
return ' '.join([self.negword, self._int2word(abs(n))]) if n < 0:
return ' '.join([self.negword, self._int2word(abs(n))])
if n == 0:
return ZERO[0] if n == 0:
return ZERO[0]
words = []
chunks = list(splitbyx(str(n), 3)) words = []
i = len(chunks) chunks = list(splitbyx(str(n), 3))
for x in chunks: i = len(chunks)
i -= 1 for x in chunks:
n1, n2, n3 = get_digits(x) i -= 1
if n3 > 0: if x == 0:
words.append(HUNDREDS[n3][0]) continue
if n2 > 1: n1, n2, n3 = get_digits(x)
words.append(TWENTIES[n2][0])
if n3 > 0:
if n2 == 1: words.append(HUNDREDS[n3][0])
words.append(TENS[n1][0])
elif n1 > 0: if n2 > 1:
ones = ONES_FEMININE if i == 1 or feminine and i == 0 else ONES words.append(TWENTIES[n2][0])
words.append(ones[n1][0])
if n2 == 1:
if i > 0 and x != 0: words.append(TENS[n1][0])
words.append(self.pluralize(x, THOUSANDS[i])) elif n1 > 0:
ones = ONES_FEMININE if i == 1 or feminine and i == 0 else ONES
return ' '.join(words) words.append(ones[n1][0])
if i > 0:
words.append(self.pluralize(x, THOUSANDS[i]))
return ' '.join(words)

View File

@@ -16,8 +16,6 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA # MA 02110-1301 USA
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from .lang_EU import Num2Word_EU from .lang_EU import Num2Word_EU

View File

@@ -1,4 +1,4 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
@@ -14,6 +14,7 @@
# License along with this library; if not, write to the Free Software # License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA # MA 02110-1301 USA
from __future__ import unicode_literals from __future__ import unicode_literals
from .base import Num2Word_Base from .base import Num2Word_Base

View File

@@ -1,184 +1,183 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or
# This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public
# modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either
# License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version.
# version 2.1 of the License, or (at your option) any later version. # This library is distributed in the hope that it will be useful,
# This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of
# but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details.
# Lesser General Public License for more details. # You should have received a copy of the GNU Lesser General Public
# You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software
# License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301 USA
# MA 02110-1301 USA
from __future__ import unicode_literals
from __future__ import unicode_literals
from num2words.base import Num2Word_Base
from num2words.base import Num2Word_Base from num2words.currency import parse_currency_parts
from num2words.currency import parse_currency_parts from num2words.utils import splitbyx
from num2words.utils import splitbyx
class Num2Word_TH(Num2Word_Base):
class Num2Word_TH(Num2Word_Base):
def setup(self):
def setup(self): self.negword = 'ติดลบ'
self.negword = 'ติดลบ' self.pointword = 'จุด'
self.pointword = 'จุด'
self.CURRENCY_FORMS = {
self.CURRENCY_FORMS = { 'THB': (('บาท', 'บาท'), ('สตางค์', 'สตางค์')),
'THB': (('บาท', 'บาท'), ('สตางค', 'สตางค')), 'USD': (('ดอลลาร์', 'ดอลลาร์'), ('เซนต', 'เซนต')),
'USD': (('ดอลลาร์', 'ดอลลาร์'), ('เซนต์', 'เซนต์')), 'EUR': (('ยูโร', 'ยูโร'), ('เซนต์', 'เซนต์')),
'EUR': (('ยูโร', 'ยูโร'), ('เซนต์', 'เซนต์')), }
}
self.high_numwords = []
self.high_numwords = []
self.mid_numwords = ['', 'สิบ', 'ร้อย', 'พัน', 'หมื่น', 'แสน', 'ล้าน']
self.mid_numwords = ['', 'สิบ', 'ร้อย', 'พัน', 'หมื่น', 'แสน', 'ล้าน']
self.low_numwords = [
self.low_numwords = [ 'ศูนย์', 'หนึ่ง', 'สอง', 'สาม', 'สี่',
'ศูนย์', 'นึ่ง', 'สอง', 'สาม', 'สี่', 'ห้า', '', 'เจ็ด', 'แปด', 'เก้า'
'ห้า', 'หก', 'เจ็ด', 'แปด', 'เก้า' ]
]
def set_high_numwords(self, high_numwords):
def set_high_numwords(self, high_numwords): pass
pass
def set_mid_numwords(self, mid_numwords):
def set_mid_numwords(self, mid_numwords): pass
pass
def splitnum(self, six_num):
def splitnum(self, six_num): length = len(six_num) > 1
length = len(six_num) > 1 word_num = ''
word_num = ''
for index, num in enumerate(map(int, six_num)):
for index, num in enumerate(map(int, six_num)): if num:
if num: if index:
if index: word_num = self.mid_numwords[index] + word_num
word_num = self.mid_numwords[index] + word_num
if length and num == 1 and index == 0:
if length and num == 1 and index == 0: word_num += 'เอ็ด'
word_num += 'เอ็ด' elif index == 1 and num == 2:
elif index == 1 and num == 2: word_num = 'ยี่' + word_num
word_num = 'ยี่' + word_num elif index != 1 or num != 1:
elif index != 1 or num != 1: word_num = self.low_numwords[num] + word_num
word_num = self.low_numwords[num] + word_num
elif num == 0 and index == 0 and length == 0:
elif num == 0 and index == 0 and length == 0: word_num = self.low_numwords[0]
word_num = self.low_numwords[0]
return word_num
return word_num
def split_six(self, num_txt):
def split_six(self, num_txt): result = splitbyx(num_txt, 6, format_int=False)
result = splitbyx(num_txt, 6, format_int=False) result = list(result)[::-1]
result = list(result)[::-1] number_list = []
number_list = [] for i in result:
for i in result: number_list.append(i[::-1])
number_list.append(i[::-1]) return number_list
return number_list
def add_text_million(self, word_num):
def add_text_million(self, word_num): result = ''
result = ''
for index, t in enumerate(reversed(word_num)):
for index, t in enumerate(reversed(word_num)): if index == 0:
if index == 0: result = t
result = t else:
else: result = result + 'ล้าน' + t
result = result + 'ล้าน' + t
return result
return result
def round_2_decimal(self, number):
def round_2_decimal(self, number): integer, cents, negative = parse_currency_parts(
integer, cents, negative = parse_currency_parts( number, is_int_with_cents=False
number, is_int_with_cents=False )
) integer = '{}'.format(integer)
integer = '{}'.format(integer) cents = '{}'.format(cents)
cents = '{}'.format(cents)
if len(cents) < 2:
if len(cents) < 2: add_zero = 2 - len(cents)
add_zero = 2 - len(cents) cents = ('0' * add_zero) + cents
cents = ('0' * add_zero) + cents
text_num = integer + '.' + cents
text_num = integer + '.' + cents
return text_num, negative
return text_num, negative
def left_num_to_text(self, number):
def left_num_to_text(self, number):
left_num_list = self.split_six(number)
left_num_list = self.split_six(number)
left_text_list = []
left_text_list = [] for i in left_num_list:
for i in left_num_list: left_text_list.append(self.splitnum(i))
left_text_list.append(self.splitnum(i))
left_text = self.add_text_million(left_text_list)
left_text = self.add_text_million(left_text_list) return left_text
return left_text
def to_cardinal(self, number):
def to_cardinal(self, number): negative = number < 0
negative = number < 0
pre, post = self.float2tuple(number)
pre, post = self.float2tuple(number) precision = self.precision
precision = self.precision pre = '{}'.format(pre)
pre = '{}'.format(pre) post = '{}'.format(post)
post = '{}'.format(post)
if negative:
if negative: pre = pre.lstrip('-')
pre = pre.lstrip('-')
if len(post) < precision:
if len(post) < precision: add_zero = precision - len(post)
add_zero = precision - len(post) post = ('0' * add_zero) + post
post = ('0' * add_zero) + post
result = self.left_num_to_text(pre)
result = self.left_num_to_text(pre)
right_text = ''
right_text = '' if not post == '0':
if not post == '0': for i in map(int, post):
for i in map(int, post): right_text = right_text + self.low_numwords[i]
right_text = right_text + self.low_numwords[i] result = result + 'จุด' + right_text
result = result + 'จุด' + right_text
if negative:
if negative: result = 'ติดลบ' + result
result = 'ติดลบ' + result
return result
return result
def to_ordinal(self, number):
def to_ordinal(self, number): return self.to_cardinal(number)
return self.to_cardinal(number)
def to_currency(self, number, currency='THB'):
def to_currency(self, number, currency='THB'):
number, negative = self.round_2_decimal(number)
number, negative = self.round_2_decimal(number)
split_num = number.split('.')
split_num = number.split('.')
left_num = split_num[0]
left_num = split_num[0] left_text = self.left_num_to_text(left_num)
left_text = self.left_num_to_text(left_num)
right_num = split_num[1]
right_num = split_num[1] right_text = self.splitnum(right_num[::-1].rstrip('0'))
right_text = self.splitnum(right_num[::-1].rstrip('0'))
try:
try: cr1, cr2 = self.CURRENCY_FORMS[currency]
cr1, cr2 = self.CURRENCY_FORMS[currency]
except KeyError:
except KeyError: raise NotImplementedError(
raise NotImplementedError( 'Currency code "%s" not implemented for "%s"' %
'Currency code "%s" not implemented for "%s"' % (currency, self.__class__.__name__))
(currency, self.__class__.__name__))
if right_num == '00':
if right_num == '00': if currency == 'THB':
if currency == 'THB': result = left_text + cr1[0] + 'ถ้วน'
result = left_text + cr1[0] + 'ถ้วน' else:
else: result = left_text + cr1[0]
result = left_text + cr1[0] else:
else: if left_num == '0':
if left_num == '0': result = right_text + cr2[0]
result = right_text + cr2[0] else:
else: result = left_text + cr1[0] + right_text + cr2[0]
result = left_text + cr1[0] + right_text + cr2[0]
if negative:
if negative: result = self.negword + result
result = self.negword + result
return result
return result

View File

@@ -1,4 +1,4 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# Copyright (c) 2017, Tufan Kaynak, Framras. All Rights Reserved. # Copyright (c) 2017, Tufan Kaynak, Framras. All Rights Reserved.

View File

@@ -1,174 +1,179 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either # License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version. # version 2.1 of the License, or (at your option) any later version.
# This library is distributed in the hope that it will be useful, # This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details. # Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public # You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software # License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA # MA 02110-1301 USA
from __future__ import unicode_literals
from __future__ import unicode_literals
from .base import Num2Word_Base
from .utils import get_digits, splitbyx from .base import Num2Word_Base
from .utils import get_digits, splitbyx
ZERO = ('нуль',)
ZERO = ('нуль',)
ONES_FEMININE = {
1: ('одна',), ONES_FEMININE = {
2: ('двi',), 1: ('одна',),
3: ('три',), 2: ('двi',),
4: ('чотири',), 3: ('три',),
5: ('п\'ять',), 4: ('чотири',),
6: ('шiсть',), 5: ('п\'ять',),
7: ('с',), 6: ('шiсть',),
8: ('вiс',), 7: ('с',),
9: ('дев\'ять',), 8: ('вiс',),
} 9: ('дев\'ять',),
}
ONES = {
1: ('один',), ONES = {
2: ('два',), 1: ('один',),
3: ('три',), 2: ('два',),
4: ('чотири',), 3: ('три',),
5: ('п\'ять',), 4: ('чотири',),
6: ('шiсть',), 5: ('п\'ять',),
7: ('с',), 6: ('шiсть',),
8: ('вiс',), 7: ('с',),
9: ('дев\'ять',), 8: ('вiс',),
} 9: ('дев\'ять',),
}
TENS = {
0: ('десять',), TENS = {
1: ('одинадцять',), 0: ('десять',),
2: ('дванадцять',), 1: ('одинадцять',),
3: ('тринадцять',), 2: ('дванадцять',),
4: ('чотирнадцять',), 3: ('тринадцять',),
5: ('п\'ятнадцять',), 4: ('чотирнадцять',),
6: ('шiстнадцять',), 5: ('п\'ятнадцять',),
7: ('снадцять',), 6: ('шiстнадцять',),
8: ('вiсiмнадцять',), 7: ('сiмнадцять',),
9: ('дев\'ятнадцять',), 8: ('вiснадцять',),
} 9: ('дев\'ятнадцять',),
}
TWENTIES = {
2: ('двадцять',), TWENTIES = {
3: ('тридцять',), 2: ('двадцять',),
4: ('сорок',), 3: ('тридцять',),
5: ('п\'ятдесят',), 4: ('сорок',),
6: ('шiстдесят',), 5: ('п\'ятдесят',),
7: ('сдесят',), 6: ('шiстдесят',),
8: ('вiсiмдесят',), 7: ('сiмдесят',),
9: ('дев\'яносто',), 8: ('вiсiмдесят',),
} 9: ('дев\'яносто',),
}
HUNDREDS = {
1: ('сто',), HUNDREDS = {
2: ('двiстi',), 1: ('сто',),
3: ('триста',), 2: ('двiстi',),
4: ('чотириста',), 3: ('триста',),
5: ('п\'ятсот',), 4: ('чотириста',),
6: ('шiстсот',), 5: ('п\'ятсот',),
7: ('ссот',), 6: ('шiстсот',),
8: ('вiссот',), 7: ('ссот',),
9: ('дев\'ятсот',), 8: ('вiссот',),
} 9: ('дев\'ятсот',),
}
THOUSANDS = {
1: ('тисяча', 'тисячi', 'тисяч'), # 10^3 THOUSANDS = {
2: ('мiльйон', 'мiльйони', 'мiльйонiв'), # 10^6 1: ('тисяча', 'тисячi', 'тисяч'), # 10^3
3: ('мiльярд', 'мiльярди', 'мiльярд'), # 10^9 2: ('мiльйон', 'мiльйони', 'мiльйон'), # 10^6
4: ('трильйон', 'трильйони', 'трильйон'), # 10^12 3: ('мiльярд', 'мiльярди', 'мiльярд'), # 10^9
5: ('квадрильйон', 'квадрильйони', 'квадрильйонiв'), # 10^15 4: ('трильйон', 'трильйони', 'трильйонiв'), # 10^12
6: ('квiнтильйон', 'квiнтильйони', 'квiнтильйонiв'), # 10^18 5: ('квадрильйон', 'квадрильйони', 'квадрильйонiв'), # 10^15
7: ('секстильйон', 'секстильйони', 'секстильйонiв'), # 10^21 6: ('квiнтильйон', 'квiнтильйони', 'квiнтильйонiв'), # 10^18
8: ('септильйон', 'септильйони', 'септильйонiв'), # 10^24 7: ('секстильйон', 'секстильйони', 'секстильйонiв'), # 10^21
9: ('октильйон', 'октильйони', 'октильйонiв'), # 10^27 8: ('септильйон', 'септильйони', 'септильйонiв'), # 10^24
10: ('нонiльйон', 'нонiльйони', 'нонiльйонiв'), # 10^30 9: ('октильйон', 'октильйони', 'октильйонiв'), # 10^27
} 10: ('нонiльйон', 'нонiльйони', 'нонiльйонiв'), # 10^30
}
class Num2Word_UK(Num2Word_Base):
CURRENCY_FORMS = { class Num2Word_UK(Num2Word_Base):
'UAH': ( CURRENCY_FORMS = {
('гривня', 'гривнi', 'гривень'), 'UAH': (
('копiйка', 'копiйки', 'копiйок') ('гривня', 'гривнi', 'гривень'),
), ('копiйка', 'копiйки', 'копiйок')
'EUR': ( ),
('євро', 'євро', 'євро'), ('цент', 'центи', 'центiв') 'EUR': (
), ('євро', 'євро', 'євро'), ('цент', 'центи', 'центiв')
} ),
}
def setup(self):
self.negword = "мiнус" def setup(self):
self.pointword = "кома" self.negword = "мiнус"
self.pointword = "кома"
def to_cardinal(self, number):
n = str(number).replace(',', '.') def to_cardinal(self, number):
if '.' in n: n = str(number).replace(',', '.')
left, right = n.split('.') if '.' in n:
return '%s %s %s' % ( left, right = n.split('.')
self._int2word(int(left)), return '%s %s %s' % (
self.pointword, self._int2word(int(left)),
self._int2word(int(right)) self.pointword,
) self._int2word(int(right))
else: )
return self._int2word(int(n)) else:
return self._int2word(int(n))
def pluralize(self, n, forms):
if n % 100 < 10 or n % 100 > 20: def pluralize(self, n, forms):
if n % 10 == 1: if n % 100 < 10 or n % 100 > 20:
form = 0 if n % 10 == 1:
elif 5 > n % 10 > 1: form = 0
form = 1 elif 5 > n % 10 > 1:
else: form = 1
form = 2 else:
else: form = 2
form = 2 else:
form = 2
return forms[form]
return forms[form]
def _int2word(self, n, feminine=True):
if n < 0: def _int2word(self, n, feminine=True):
return ' '.join([self.negword, self._int2word(abs(n))]) if n < 0:
return ' '.join([self.negword, self._int2word(abs(n))])
if n == 0:
return ZERO[0] if n == 0:
return ZERO[0]
words = []
chunks = list(splitbyx(str(n), 3)) words = []
i = len(chunks) chunks = list(splitbyx(str(n), 3))
for x in chunks: i = len(chunks)
i -= 1 for x in chunks:
n1, n2, n3 = get_digits(x) i -= 1
if n3 > 0: if x == 0:
words.append(HUNDREDS[n3][0]) continue
if n2 > 1: n1, n2, n3 = get_digits(x)
words.append(TWENTIES[n2][0])
if n3 > 0:
if n2 == 1: words.append(HUNDREDS[n3][0])
words.append(TENS[n1][0])
# elif n1 > 0 and not (i > 0 and x == 1): if n2 > 1:
elif n1 > 0: words.append(TWENTIES[n2][0])
ones = ONES_FEMININE if i == 1 or feminine and i == 0 else ONES
words.append(ones[n1][0]) if n2 == 1:
words.append(TENS[n1][0])
if i > 0 and ((n1 + n2 + n3) > 0): # elif n1 > 0 and not (i > 0 and x == 1):
words.append(self.pluralize(x, THOUSANDS[i])) elif n1 > 0:
ones = ONES_FEMININE if i == 1 or feminine and i == 0 else ONES
return ' '.join(words) words.append(ones[n1][0])
def _cents_verbose(self, number, currency): if i > 0:
return self._int2word(number, currency == 'UAH') words.append(self.pluralize(x, THOUSANDS[i]))
def to_ordinal(self, number): return ' '.join(words)
raise NotImplementedError()
def _cents_verbose(self, number, currency):
return self._int2word(number, currency == 'UAH')
def to_ordinal(self, number):
raise NotImplementedError()

View File

@@ -1,17 +1,35 @@
def splitbyx(n, x, format_int=True): # -*- coding: utf-8 -*-
length = len(n) # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
if length > x: # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
start = length % x
if start > 0: # This library is free software; you can redistribute it and/or
result = n[:start] # modify it under the terms of the GNU Lesser General Public
yield int(result) if format_int else result # License as published by the Free Software Foundation; either
for i in range(start, length, x): # version 2.1 of the License, or (at your option) any later version.
result = n[i:i+x] # This library is distributed in the hope that it will be useful,
yield int(result) if format_int else result # but WITHOUT ANY WARRANTY; without even the implied warranty of
else: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yield int(n) if format_int else n # Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
def get_digits(n): # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
a = [int(x) for x in reversed(list(('%03d' % n)[-3:]))] # MA 02110-1301 USA
return a
def splitbyx(n, x, format_int=True):
length = len(n)
if length > x:
start = length % x
if start > 0:
result = n[:start]
yield int(result) if format_int else result
for i in range(start, length, x):
result = n[i:i+x]
yield int(result) if format_int else result
else:
yield int(n) if format_int else n
def get_digits(n):
a = [int(x) for x in reversed(list(('%03d' % n)[-3:]))]
return a

View File

@@ -1,4 +1,22 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA
import re import re
from io import open
from setuptools import find_packages, setup from setuptools import find_packages, setup
@@ -17,8 +35,8 @@ CLASSIFIERS = [
'Topic :: Text Processing :: Linguistic', 'Topic :: Text Processing :: Linguistic',
] ]
LONG_DESC = open('README.rst', 'rt').read() + '\n\n' + \ LONG_DESC = open('README.rst', 'rt', encoding="utf-8").read() + '\n\n' + \
open('CHANGES.rst', 'rt').read() open('CHANGES.rst', 'rt', encoding="utf-8").read()
def find_version(fname): def find_version(fname):
@@ -26,7 +44,7 @@ def find_version(fname):
Returns str or raises RuntimeError Returns str or raises RuntimeError
""" """
version = '' version = ''
with open(fname, 'r') as fp: with open(fname, 'r', encoding="utf-8") as fp:
reg = re.compile(r'__version__ = [\'"]([^\'"]*)[\'"]') reg = re.compile(r'__version__ = [\'"]([^\'"]*)[\'"]')
for line in fp: for line in fp:
m = reg.match(line) m = reg.match(line)

View File

@@ -1,4 +1,5 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
@@ -13,7 +14,6 @@
# License along with this library; if not, write to the Free Software # License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA # MA 02110-1301 USA
# from __future__ import unicode_literals
from unittest import TestCase from unittest import TestCase

View File

@@ -1,3 +1,20 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA
from __future__ import unicode_literals from __future__ import unicode_literals
from decimal import Decimal from decimal import Decimal

View File

@@ -1,5 +1,20 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@@ -1,3 +1,20 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA
from decimal import Decimal from decimal import Decimal
from unittest import TestCase from unittest import TestCase

View File

@@ -1,5 +1,6 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public

View File

@@ -1,5 +1,6 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public

View File

@@ -1,3 +1,5 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or

View File

@@ -1,3 +1,5 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or

View File

@@ -1,4 +1,5 @@
# encoding: UTF-8 # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
@@ -13,6 +14,7 @@
# License along with this library; if not, write to the Free Software # License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA # MA 02110-1301 USA
from __future__ import unicode_literals from __future__ import unicode_literals
from unittest import TestCase from unittest import TestCase

View File

@@ -1,4 +1,5 @@
# encoding: UTF-8 # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or

View File

@@ -1,4 +1,5 @@
# encoding: UTF-8 # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
@@ -13,7 +14,6 @@
# License along with this library; if not, write to the Free Software # License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA # MA 02110-1301 USA
from __future__ import unicode_literals from __future__ import unicode_literals
from num2words import num2words from num2words import num2words

View File

@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or

View File

@@ -1,19 +1,19 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copetright (c) 2015, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This libraret is free software; etou can redistribute it and/or # This library is free software; you can redistribute it and/or
# modifet it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public
# License as published bet the Free Software Foundation; either # License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at etour option) anet later version. # version 2.1 of the License, or (at your option) any later version.
# This libraret is distributed in the hope that it will be useful, # This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warrantet of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details. # Lesser General Public License for more details.
# You should have received a copet of the GNU Lesser General Public # You should have received a copy of the GNU Lesser General Public
# License along with this libraret; if not, write to the Free Software # License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA # MA 02110-1301 USA
from __future__ import unicode_literals from __future__ import unicode_literals
from unittest import TestCase from unittest import TestCase

View File

@@ -1,5 +1,6 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public
@@ -13,7 +14,6 @@
# License along with this library; if not, write to the Free Software # License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA # MA 02110-1301 USA
from __future__ import unicode_literals from __future__ import unicode_literals
from unittest import TestCase from unittest import TestCase

View File

@@ -1,5 +1,6 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public

View File

@@ -1,5 +1,6 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public

View File

@@ -1,3 +1,5 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or

View File

@@ -1,5 +1,6 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public

View File

@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or

View File

@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or

View File

@@ -1,4 +1,20 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA
from __future__ import unicode_literals from __future__ import unicode_literals
from unittest import TestCase from unittest import TestCase
@@ -53,9 +69,6 @@ class Num2WordsLTTest(TestCase):
'minus penki tūkstančiai kablelis dvidešimt du', 'minus penki tūkstančiai kablelis dvidešimt du',
) )
# print(fill(n2w(1000000000000000000000000000000)))
# naintilijonas
def test_to_ordinal(self): def test_to_ordinal(self):
# @TODO: implement to_ordinal # @TODO: implement to_ordinal
with self.assertRaises(NotImplementedError): with self.assertRaises(NotImplementedError):

View File

@@ -1,4 +1,20 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA
from __future__ import unicode_literals from __future__ import unicode_literals
from unittest import TestCase from unittest import TestCase
@@ -48,9 +64,6 @@ class Num2WordsLVTest(TestCase):
'mīnus pieci tūkstoši komats divdesmit divi', 'mīnus pieci tūkstoši komats divdesmit divi',
) )
# >>> print(fill(n2w(1000000000000000000000000000000)))
# nontiljons
self.assertEqual(num2words(0, lang='lv'), 'nulle') self.assertEqual(num2words(0, lang='lv'), 'nulle')
self.assertEqual(num2words(5, lang='lv'), "pieci") self.assertEqual(num2words(5, lang='lv'), "pieci")
self.assertEqual(num2words(15, lang='lv'), "piecpadsmit") self.assertEqual(num2words(15, lang='lv'), "piecpadsmit")

View File

@@ -1,5 +1,6 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public

View File

@@ -1,5 +1,6 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public
@@ -45,6 +46,10 @@ class Num2WordsPLTest(TestCase):
"miliard dwieście trzydzieści cztery miliony pięćset " "miliard dwieście trzydzieści cztery miliony pięćset "
"sześćdziesiąt siedem tysięcy osiemset dziewięćdzisiąt" "sześćdziesiąt siedem tysięcy osiemset dziewięćdzisiąt"
) )
self.assertEqual(
num2words(10000000001000000100000, lang='pl'),
"dziesięć tryliardów bilion sto tysięcy"
)
self.assertEqual( self.assertEqual(
num2words(215461407892039002157189883901676, lang='pl'), num2words(215461407892039002157189883901676, lang='pl'),
"dwieście piętnaście kwintylionów czterysta sześćdziesiąt jeden " "dwieście piętnaście kwintylionów czterysta sześćdziesiąt jeden "
@@ -52,7 +57,7 @@ class Num2WordsPLTest(TestCase):
"dziewięćdzisiąt dwa tryliardy trzydzieści dziewięć trylionów " "dziewięćdzisiąt dwa tryliardy trzydzieści dziewięć trylionów "
"dwa biliardy sto pięćdziesiąt siedem bilionów sto osiemdziesiąt " "dwa biliardy sto pięćdziesiąt siedem bilionów sto osiemdziesiąt "
"dziewięć miliardów osiemset osiemdziesiąt trzy miliony " "dziewięć miliardów osiemset osiemdziesiąt trzy miliony "
"dziewęćset jeden tysięcy sześćset siedemdziesiąt sześć" "dziewięćset jeden tysięcy sześćset siedemdziesiąt sześć"
) )
self.assertEqual( self.assertEqual(
num2words(719094234693663034822824384220291, lang='pl'), num2words(719094234693663034822824384220291, lang='pl'),
@@ -66,19 +71,15 @@ class Num2WordsPLTest(TestCase):
) )
self.assertEqual( self.assertEqual(
num2words( num2words(
963301000001918264129471042047146102350812074235000101020000120324, 963301000001918264129471001047146102 * 10**30 + 1007,
lang='pl' lang='pl'
), ),
"dziewięćset sześćdziesiąt trzy decyliardy trzysta jeden " "dziewięćset sześćdziesiąt trzy decyliardy trzysta jeden "
"decylionów nonylion dziewięćset osiemnaście oktyliardów dwieście " "decylionów nonylion dziewięćset osiemnaście oktyliardów dwieście "
"sześćdziesiąt cztery oktyliony sto dwadzieścia dziewięć " "sześćdziesiąt cztery oktyliony sto dwadzieścia dziewięć "
"septyliardów czterysta siedemdziesiąt jeden septylionów " "septyliardów czterysta siedemdziesiąt jeden septylionów "
"czterdzieści dwa sekstyliardy czterdzieści siedem sekstylionów " "sekstyliard czterdzieści siedem sekstylionów sto czterdzieści "
"sto czterdzieści sześć kwintyliardów sto dwa kwintyliony trzysta " "sześć kwintyliardów sto dwa kwintyliony tysiąc siedem"
"pięćdziesiąt kwadryliardów osiemset dwanaście kwadrylionów "
"siedemdziesiąt cztery tryliardy dwieście trzydzieści pięć "
"trylionów sto jeden bilionów dwadzieścia miliardów sto "
"dwadzieścia tysięcy trzysta dwadzieścia cztery"
) )
def test_to_ordinal(self): def test_to_ordinal(self):

View File

@@ -1,5 +1,6 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public

View File

@@ -1,5 +1,6 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public

View File

@@ -1,4 +1,5 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or

View File

@@ -1,4 +1,5 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
@@ -13,6 +14,7 @@
# License along with this library; if not, write to the Free Software # License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA # MA 02110-1301 USA
from __future__ import unicode_literals from __future__ import unicode_literals
from unittest import TestCase from unittest import TestCase

View File

@@ -1,5 +1,6 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public

View File

@@ -1,4 +1,5 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
@@ -13,6 +14,7 @@
# License along with this library; if not, write to the Free Software # License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA # MA 02110-1301 USA
from __future__ import unicode_literals from __future__ import unicode_literals
from unittest import TestCase from unittest import TestCase

View File

@@ -1,193 +1,208 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
from __future__ import unicode_literals # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
from unittest import TestCase # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
from num2words import num2words # License as published by the Free Software Foundation; either
from num2words.lang_TH import Num2Word_TH # version 2.1 of the License, or (at your option) any later version.
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
class TestNumWord(TestCase): # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
def test_0(self): # You should have received a copy of the GNU Lesser General Public
self.assertEqual(num2words(0, lang='th'), "ศูนย์") # License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
def test_end_with_1(self): # MA 02110-1301 USA
self.assertEqual(num2words(21, lang='th'), "ยี่สิบเอ็ด")
self.assertEqual(num2words(11, lang='th'), "สิบเอ็ด") from __future__ import unicode_literals
self.assertEqual(num2words(101, lang='th'), "หนึ่งร้อยเอ็ด")
self.assertEqual(num2words(1201, lang='th'), "หนึ่งพันสองร้อยเอ็ด") from unittest import TestCase
def test_start_20(self): from num2words import num2words
self.assertEqual(num2words(22, lang='th'), "ยี่สิบสอง") from num2words.lang_TH import Num2Word_TH
self.assertEqual(num2words(27, lang='th'), "ยี่สิบเจ็ด")
def test_start_10(self): class TestNumWord(TestCase):
self.assertEqual(num2words(10, lang='th'), "สิบ")
self.assertEqual(num2words(18, lang='th'), "สิบแปด") def test_0(self):
self.assertEqual(num2words(0, lang='th'), "ศูนย์")
def test_1_to_9(self):
self.assertEqual(num2words(1, lang='th'), "หนึ่ง") def test_end_with_1(self):
self.assertEqual(num2words(5, lang='th'), "ห้า") self.assertEqual(num2words(21, lang='th'), "ยี่สิบเอ็ด")
self.assertEqual(num2words(9, lang='th'), "เก้า") self.assertEqual(num2words(11, lang='th'), "สิบเอ็ด")
self.assertEqual(num2words(101, lang='th'), "หนึ่งร้อยเอ็ด")
def test_31_to_99(self): self.assertEqual(num2words(1201, lang='th'), "หนึ่งพันสองร้อยเอ็ด")
self.assertEqual(num2words(31, lang='th'), "สามสิบเอ็ด")
self.assertEqual(num2words(48, lang='th'), "สี่สิบแปด") def test_start_20(self):
self.assertEqual(num2words(76, lang='th'), "เจ็ดสิบหก") self.assertEqual(num2words(22, lang='th'), "ยี่สิบสอง")
self.assertEqual(num2words(27, lang='th'), "ยี่สิบเจ็ด")
def test_100_to_999(self):
self.assertEqual(num2words(100, lang='th'), "หนึ่งร้อย") def test_start_10(self):
self.assertEqual(num2words(123, lang='th'), "หนึ่งร้อยยี่สิบสาม") self.assertEqual(num2words(10, lang='th'), "สิบ")
self.assertEqual(num2words(456, lang='th'), "ี่ร้อยห้าสิบหก") self.assertEqual(num2words(18, lang='th'), "ิบแปด")
self.assertEqual(num2words(721, lang='th'), "เจ็ดร้อยยี่สิบเอ็ด")
def test_1_to_9(self):
def test_1000_to_9999(self): self.assertEqual(num2words(1, lang='th'), "หนึ่ง")
self.assertEqual(num2words(1000, lang='th'), "นึ่งพัน") self.assertEqual(num2words(5, lang='th'), "้า")
self.assertEqual( self.assertEqual(num2words(9, lang='th'), "เก้า")
num2words(2175, lang='th'), "สองพันหนึ่งร้อยเจ็ดสิบห้า"
) def test_31_to_99(self):
self.assertEqual(num2words(4582, lang='th'), "ี่พันห้าร้อยแปดสิบสอง") self.assertEqual(num2words(31, lang='th'), "ามสิบเอ็ด")
self.assertEqual(num2words(9346, lang='th'), "เก้าพันสามร้อยสี่สิบหก") self.assertEqual(num2words(48, lang='th'), "สี่สิบแปด")
self.assertEqual(num2words(76, lang='th'), "เจ็ดสิบหก")
def test_10000_to_99999(self):
self.assertEqual( def test_100_to_999(self):
num2words(11111, lang='th'), "หนึ่งหมื่นหนึ่งพันหนึ่งร้อยสิบเอ็ด" self.assertEqual(num2words(100, lang='th'), "หนึ่งร้อย")
) self.assertEqual(num2words(123, lang='th'), "หนึ่งร้อยยี่สิบสาม")
self.assertEqual( self.assertEqual(num2words(456, lang='th'), "สี่ร้อยห้าสิบหก")
num2words(22222, lang='th'), "สองหมื่นสองพันสองร้อยยี่สิบสอง" self.assertEqual(num2words(721, lang='th'), "เจ็ดร้อยยี่สิบเอ็ด")
)
self.assertEqual( def test_1000_to_9999(self):
num2words(84573, lang='th'), "แปดหมื่นสี่พันห้าร้อยเจ็ดสิบสาม" self.assertEqual(num2words(1000, lang='th'), "หนึ่งพัน")
) self.assertEqual(
num2words(2175, lang='th'), "สองพันหนึ่งร้อยเจ็ดสิบห้า"
def test_100000_to_999999(self): )
self.assertEqual( self.assertEqual(num2words(4582, lang='th'), "สี่พันห้าร้อยแปดสิบสอง")
num2words(153247, lang='th'), self.assertEqual(num2words(9346, lang='th'), "เก้าพันสามร้อยสี่สิบหก")
"หนึ่งแสนห้าหมื่นสามพันสองร้อยสี่สิบเจ็ด"
) def test_10000_to_99999(self):
self.assertEqual( self.assertEqual(
num2words(562442, lang='th'), num2words(11111, lang='th'), "หนึ่งหมื่นหนึ่งพันหนึ่งร้อยสิบเอ็ด"
"ห้าแสนหกหมื่นสองพันสี่ร้อยสี่สิบสอง" )
) self.assertEqual(
self.assertEqual( num2words(22222, lang='th'), "สองหมื่นสองพันสองร้อยยี่สิบสอง"
num2words(999999, lang='th'), )
"เก้าแสนเก้าหมื่นเก้าพันเก้าร้อยเก้าสิบเก้า" self.assertEqual(
) num2words(84573, lang='th'), "แปดหมื่นสี่พันห้าร้อยเจ็ดสิบสาม"
)
def test_more_than_million(self):
self.assertEqual( def test_100000_to_999999(self):
num2words(1000000, lang='th'), self.assertEqual(
"หนึ่งล้าน" num2words(153247, lang='th'),
) "หนึ่งแสนห้าหมื่นสามพันสองร้อยสี่สิบเจ็ด"
self.assertEqual( )
num2words(1000001, lang='th'), self.assertEqual(
"หนึ่งล้านเอ็ด" num2words(562442, lang='th'),
) "ห้าแสนหกหมื่นสองพันสี่ร้อยสี่สิบสอง"
self.assertEqual( )
num2words(42478941, lang='th'), self.assertEqual(
"สี่สิบสองล้านสี่แสนเจ็ดหมื่นแปดพันเก้าร้อยสี่สิบเอ็ด" num2words(999999, lang='th'),
) "เก้าแสนเก้าหมื่นเก้าพันเก้าร้อยเก้าสิบเก้า"
self.assertEqual( )
num2words(712696969, lang='th'),
"เจ็ดร้อยสิบสองล้านหกแสนเก้าหมื่นหกพันเก้าร้อยหกสิบเก้า" def test_more_than_million(self):
) self.assertEqual(
self.assertEqual( num2words(1000000, lang='th'),
num2words(1000000000000000001, lang='th'), "หนึ่งล้าน"
"หนึ่งล้านล้านล้านเอ็ด" )
) self.assertEqual(
num2words(1000001, lang='th'),
def test_decimal(self): "หนึ่งล้านเอ็ด"
self.assertEqual( )
num2words(0.0, lang='th'), "ศูนย์" self.assertEqual(
) num2words(42478941, lang='th'),
self.assertEqual( "สี่สิบสองล้านสี่แสนเจ็ดหมื่นแปดพันเก้าร้อยสี่สิบเอ็ด"
num2words(0.0038, lang='th'), "ศูนย์จุดศูนย์ศูนย์สามแปด" )
) self.assertEqual(
self.assertEqual( num2words(712696969, lang='th'),
num2words(0.01, lang='th'), "ศูนย์จุดศูนย์หนึ่ง" "เจ็ดร้อยสิบสองล้านหกแสนเก้าหมื่นหกพันเก้าร้อยหกสิบเก้า"
) )
self.assertEqual( self.assertEqual(
num2words(1.123, lang='th'), "หนึ่งจุดหนึ่งสองสาม" num2words(1000000000000000001, lang='th'),
) "หนึ่งล้านล้านล้านเอ็ด"
self.assertEqual( )
num2words(35.37, lang='th'), "สามสิบห้าจุดสามเจ็ด"
) def test_decimal(self):
self.assertEqual( self.assertEqual(
num2words(1000000.01, lang='th'), "หนึ่งล้านจุดศูนย์หนึ่ง" num2words(0.0, lang='th'), "ศูนย์"
) )
self.assertEqual(
def test_currency(self): num2words(0.0038, lang='th'), "ศูนย์จุดศูนย์ศูนย์สามแปด"
self.assertEqual( )
num2words(100, lang='th', to='currency', currency='THB'), self.assertEqual(
"หนึ่งร้อยบาทถ้วน" num2words(0.01, lang='th'), "ศูนย์จุดศูนย์หนึ่ง"
) )
self.assertEqual( self.assertEqual(
num2words(100, lang='th', to='currency', currency='USD'), num2words(1.123, lang='th'), "หนึ่งจุดหนึ่งสองสาม"
"หนึ่งร้อยดอลลาร์" )
) self.assertEqual(
self.assertEqual( num2words(35.37, lang='th'), "สามสิบห้าจุดสามเจ็ด"
num2words(100, lang='th', to='currency', currency='EUR'), )
"หนึ่งร้อยยูโร" self.assertEqual(
) num2words(1000000.01, lang='th'), "หนึ่งล้านจุดศูนย์หนึ่ง"
)
def test_currency_decimal(self):
self.assertEqual( def test_currency(self):
num2words(0.00, lang='th', to='currency'), "ศูนย์บาทถ้วน" self.assertEqual(
) num2words(100, lang='th', to='currency', currency='THB'),
self.assertEqual( "หนึ่งร้อยบาทถ้วน"
num2words(0.05, lang='th', to='currency'), "ห้าสตางค์" )
) self.assertEqual(
self.assertEqual( num2words(100, lang='th', to='currency', currency='USD'),
num2words(0.50, lang='th', to='currency'), "ห้าสิบสตางค" "หนึ่งร้อยดอลลาร"
) )
self.assertEqual( self.assertEqual(
num2words(0.99, lang='th', to='currency'), "เก้าสิบเก้าสตางค์" num2words(100, lang='th', to='currency', currency='EUR'),
) "หนึ่งร้อยยูโร"
self.assertEqual( )
num2words(100.00, lang='th', to='currency'), "หนึ่งร้อยบาทถ้วน"
) def test_currency_decimal(self):
self.assertEqual( self.assertEqual(
num2words(100.23, lang='th', to='currency', currency='USD'), num2words(0.00, lang='th', to='currency'), "ศูนย์บาทถ้วน"
"หนึ่งร้อยดอลลาร์ยี่สิบสามเซนต์" )
) self.assertEqual(
self.assertEqual( num2words(0.05, lang='th', to='currency'), "ห้าสตางค์"
num2words(100.24, lang='th', to='currency', currency='EUR'), )
"หนึ่งร้อยยูโรยี่สิบสี่เซนต์" self.assertEqual(
) num2words(0.50, lang='th', to='currency'), "ห้าสิบสตางค์"
)
def test_negative(self): self.assertEqual(
self.assertEqual(num2words(-10, lang='th'), "ติดลบสิบ") num2words(0.99, lang='th', to='currency'), "เก้าสิบเก้าสตางค์"
self.assertEqual(num2words(-10.50, lang='th'), "ติดลบสิบจุดห้า") )
self.assertEqual( self.assertEqual(
num2words(-100.00, lang='th', to='currency'), num2words(100.00, lang='th', to='currency'), "หนึ่งร้อยบาทถ้วน"
"ติดลบหนึ่งร้อยบาทถ้วน" )
) self.assertEqual(
num2words(100.23, lang='th', to='currency', currency='USD'),
def test_round_2_decimal(self): "หนึ่งร้อยดอลลาร์ยี่สิบสามเซนต์"
n2wTH = Num2Word_TH() )
self.assertEqual(n2wTH.round_2_decimal(0.004), ('0.00', False)) self.assertEqual(
self.assertEqual(n2wTH.round_2_decimal(0.005), ('0.01', False)) num2words(100.24, lang='th', to='currency', currency='EUR'),
self.assertEqual(n2wTH.round_2_decimal(0.006), ('0.01', False)) "หนึ่งร้อยยูโรยี่สิบสี่เซนต์"
self.assertEqual(n2wTH.round_2_decimal(0.0005), )
('0.00', False))
self.assertEqual(n2wTH.round_2_decimal(0.984), ('0.98', False)) def test_negative(self):
self.assertEqual(n2wTH.round_2_decimal(0.989), ('0.99', False)) self.assertEqual(num2words(-10, lang='th'), "ติดลบสิบ")
self.assertEqual(n2wTH.round_2_decimal(0.994), ('0.99', False)) self.assertEqual(num2words(-10.50, lang='th'), "ติดลบสิบจุดห้า")
self.assertEqual(n2wTH.round_2_decimal(0.999), ('1.00', False)) self.assertEqual(
self.assertEqual(n2wTH.round_2_decimal(-0.994), ('0.99', True)) num2words(-100.00, lang='th', to='currency'),
self.assertEqual(n2wTH.round_2_decimal(-0.999), ('1.00', True)) "ติดลบหนึ่งร้อยบาทถ้วน"
# self.assertEqual(n2wTH.round_2_decimal(0.985), ('0.99', False)) )
# Expect 0.99 get 0.98
# self.assertEqual(n2wTH.round_2_decimal(0.995), ('1.00', False)) def test_round_2_decimal(self):
# Expect 1.00 get 0.99 n2wTH = Num2Word_TH()
self.assertEqual(n2wTH.round_2_decimal(0.004), ('0.00', False))
def test_split_six(self): self.assertEqual(n2wTH.round_2_decimal(0.005), ('0.01', False))
n2wTH = Num2Word_TH() self.assertEqual(n2wTH.round_2_decimal(0.006), ('0.01', False))
self.assertEqual(n2wTH.split_six(str(123456789)), self.assertEqual(n2wTH.round_2_decimal(0.0005),
['987654', '321']) ('0.00', False))
self.assertEqual(n2wTH.split_six(str(12345)), self.assertEqual(n2wTH.round_2_decimal(0.984), ('0.98', False))
['54321']) self.assertEqual(n2wTH.round_2_decimal(0.989), ('0.99', False))
self.assertEqual(n2wTH.split_six(str(1234567)), self.assertEqual(n2wTH.round_2_decimal(0.994), ('0.99', False))
['765432', '1']) self.assertEqual(n2wTH.round_2_decimal(0.999), ('1.00', False))
self.assertEqual(n2wTH.round_2_decimal(-0.994), ('0.99', True))
self.assertEqual(n2wTH.round_2_decimal(-0.999), ('1.00', True))
# self.assertEqual(n2wTH.round_2_decimal(0.985), ('0.99', False))
# Expect 0.99 get 0.98
# self.assertEqual(n2wTH.round_2_decimal(0.995), ('1.00', False))
# Expect 1.00 get 0.99
def test_split_six(self):
n2wTH = Num2Word_TH()
self.assertEqual(n2wTH.split_six(str(123456789)),
['987654', '321'])
self.assertEqual(n2wTH.split_six(str(12345)),
['54321'])
self.assertEqual(n2wTH.split_six(str(1234567)),
['765432', '1'])

View File

@@ -1,6 +1,6 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# Copyright (c) 2017, Tufan Kaynak, Framras. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public

View File

@@ -1,4 +1,5 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
@@ -13,6 +14,7 @@
# License along with this library; if not, write to the Free Software # License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA # MA 02110-1301 USA
from __future__ import unicode_literals from __future__ import unicode_literals
from unittest import TestCase from unittest import TestCase

View File

@@ -1,24 +1,41 @@
from unittest import TestCase # -*- coding: utf-8 -*-
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
from num2words.utils import splitbyx # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or
class TestUtils(TestCase): # modify it under the terms of the GNU Lesser General Public
def test_splitbyx(self): # License as published by the Free Software Foundation; either
self.assertEqual(list(splitbyx(str(12), 3)), [12]) # version 2.1 of the License, or (at your option) any later version.
self.assertEqual(list(splitbyx(str(1234), 3)), [1, 234]) # This library is distributed in the hope that it will be useful,
self.assertEqual(list(splitbyx(str(12345678900), 3)), # but WITHOUT ANY WARRANTY; without even the implied warranty of
[12, 345, 678, 900] # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
) # Lesser General Public License for more details.
self.assertEqual(list(splitbyx(str(1000000), 6)), [1, 0]) # You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
self.assertEqual(list(splitbyx(str(12), 3, format_int=False)), ['12']) # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
self.assertEqual(list(splitbyx(str(1234), 3, format_int=False)), # MA 02110-1301 USA
['1', '234']
) from unittest import TestCase
self.assertEqual(list(splitbyx(str(12345678900), 3, format_int=False)),
['12', '345', '678', '900'] from num2words.utils import splitbyx
)
self.assertEqual(list(splitbyx(str(1000000), 6, format_int=False)),
['1', '000000'] class TestUtils(TestCase):
) def test_splitbyx(self):
self.assertEqual(list(splitbyx(str(12), 3)), [12])
self.assertEqual(list(splitbyx(str(1234), 3)), [1, 234])
self.assertEqual(list(splitbyx(str(12345678900), 3)),
[12, 345, 678, 900]
)
self.assertEqual(list(splitbyx(str(1000000), 6)), [1, 0])
self.assertEqual(list(splitbyx(str(12), 3, format_int=False)), ['12'])
self.assertEqual(list(splitbyx(str(1234), 3, format_int=False)),
['1', '234']
)
self.assertEqual(list(splitbyx(str(12345678900), 3, format_int=False)),
['12', '345', '678', '900']
)
self.assertEqual(list(splitbyx(str(1000000), 6, format_int=False)),
['1', '000000']
)

View File

@@ -1,5 +1,6 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved. # Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public