mirror of
https://github.com/bblaz/num2words.git
synced 2025-12-06 06:42:25 +00:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
@@ -46,8 +46,6 @@ Command line::
|
||||
|
||||
$ num2words 10001
|
||||
ten thousand and one
|
||||
$ num2words 10123123 --lang es
|
||||
diez millones ciento veintitrés mil ciento veintitrés
|
||||
$ num2words 24,120.10
|
||||
twenty-four thousand, one hundred and twenty point one
|
||||
$ num2words 24,120.10 -l es
|
||||
|
||||
@@ -1,5 +1,21 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- 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.
|
||||
|
||||
Usage:
|
||||
@@ -22,9 +38,6 @@ Options:
|
||||
Examples:
|
||||
$ num2words 10001
|
||||
ten thousand and one
|
||||
|
||||
$ num2words 10123123 --lang es
|
||||
diez millones ciento veintitrés mil ciento veintitrés
|
||||
|
||||
$ num2words 24,120.10
|
||||
twenty-four thousand, one hundred and twenty point one
|
||||
@@ -35,6 +48,7 @@ Examples:
|
||||
$num2words 2.14 -l es --to currency
|
||||
dos euros con catorce centimos
|
||||
"""
|
||||
|
||||
from __future__ import print_function, unicode_literals
|
||||
import os
|
||||
import sys
|
||||
|
||||
7
docker-compose.yml
Normal file
7
docker-compose.yml
Normal file
@@ -0,0 +1,7 @@
|
||||
version: '3.0'
|
||||
services:
|
||||
web:
|
||||
image: python:3-alpine
|
||||
command: python3 -m http.server 8080
|
||||
volumes:
|
||||
- .:/num2words
|
||||
@@ -1,3 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
|
||||
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
|
||||
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# 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
|
||||
# modify it under the terms of the GNU Lesser General Public
|
||||
|
||||
@@ -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 decimal import ROUND_HALF_UP, Decimal
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2003, Taro Ogawa. 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
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
# MA 02110-1301 USA
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from .base import Num2Word_Base
|
||||
@@ -130,6 +131,10 @@ class Num2Word_CZ(Num2Word_Base):
|
||||
i = len(chunks)
|
||||
for x in chunks:
|
||||
i -= 1
|
||||
|
||||
if x == 0:
|
||||
continue
|
||||
|
||||
n1, n2, n3 = get_digits(x)
|
||||
|
||||
if n3 > 0:
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
|
||||
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
|
||||
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
|
||||
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
# encoding: UTF-8
|
||||
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
|
||||
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
# encoding: UTF-8
|
||||
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
|
||||
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
# encoding: UTF-8
|
||||
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
|
||||
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
|
||||
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
|
||||
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
|
||||
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2003, Taro Ogawa. 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
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
# MA 02110-1301 USA
|
||||
|
||||
from __future__ import print_function, unicode_literals
|
||||
|
||||
from .lang_FR import Num2Word_FR
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
|
||||
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
|
||||
|
||||
|
||||
@@ -1,148 +1,150 @@
|
||||
# -*- encoding: 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 print_function, unicode_literals
|
||||
|
||||
from .utils import get_digits, splitbyx
|
||||
|
||||
ZERO = (u'אפס',)
|
||||
|
||||
ONES = {
|
||||
1: (u'אחד',),
|
||||
2: (u'שנים',),
|
||||
3: (u'שלש',),
|
||||
4: (u'ארבע',),
|
||||
5: (u'חמש',),
|
||||
6: (u'שש',),
|
||||
7: (u'שבע',),
|
||||
8: (u'שמנה',),
|
||||
9: (u'תשע',),
|
||||
}
|
||||
|
||||
TENS = {
|
||||
0: (u'עשר',),
|
||||
1: (u'אחד עשרה',),
|
||||
2: (u'שנים עשרה',),
|
||||
3: (u'שלש עשרה',),
|
||||
4: (u'ארבע עשרה',),
|
||||
5: (u'חמש עשרה',),
|
||||
6: (u'שש עשרה',),
|
||||
7: (u'שבע עשרה',),
|
||||
8: (u'שמנה עשרה',),
|
||||
9: (u'תשע עשרה',),
|
||||
}
|
||||
|
||||
TWENTIES = {
|
||||
2: (u'עשרים',),
|
||||
3: (u'שלשים',),
|
||||
4: (u'ארבעים',),
|
||||
5: (u'חמישים',),
|
||||
6: (u'ששים',),
|
||||
7: (u'שבעים',),
|
||||
8: (u'שמנים',),
|
||||
9: (u'תשעים',),
|
||||
}
|
||||
|
||||
HUNDRED = {
|
||||
1: (u'מאה',),
|
||||
2: (u'מאתיים',),
|
||||
3: (u'מאות',)
|
||||
}
|
||||
|
||||
THOUSANDS = {
|
||||
1: (u'אלף',),
|
||||
2: (u'אלפיים',),
|
||||
}
|
||||
|
||||
AND = u'ו'
|
||||
|
||||
|
||||
def pluralize(n, forms):
|
||||
# gettext implementation:
|
||||
# (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
|
||||
|
||||
return forms[form]
|
||||
|
||||
|
||||
def int2word(n):
|
||||
if n > 9999: # doesn't yet work for numbers this big
|
||||
raise NotImplementedError()
|
||||
|
||||
if n == 0:
|
||||
return ZERO[0]
|
||||
|
||||
words = []
|
||||
|
||||
chunks = list(splitbyx(str(n), 3))
|
||||
i = len(chunks)
|
||||
for x in chunks:
|
||||
i -= 1
|
||||
n1, n2, n3 = get_digits(x)
|
||||
|
||||
# print str(n3) + str(n2) + str(n1)
|
||||
|
||||
if n3 > 0:
|
||||
if n3 <= 2:
|
||||
words.append(HUNDRED[n3][0])
|
||||
else:
|
||||
words.append(ONES[n3][0])
|
||||
words.append(HUNDRED[3][0])
|
||||
|
||||
if n2 > 1:
|
||||
words.append(TWENTIES[n2][0])
|
||||
|
||||
if n2 == 1:
|
||||
words.append(TENS[n1][0])
|
||||
elif n1 > 0 and not (i > 0 and x == 1):
|
||||
words.append(ONES[n1][0])
|
||||
|
||||
if i > 0:
|
||||
if i <= 2:
|
||||
words.append(THOUSANDS[i][0])
|
||||
else:
|
||||
words.append(ONES[i][0])
|
||||
words.append(THOUSANDS[1][0])
|
||||
|
||||
if len(words) > 1:
|
||||
words[-1] = AND + words[-1]
|
||||
return ' '.join(words)
|
||||
|
||||
|
||||
def n2w(n):
|
||||
return int2word(int(n))
|
||||
|
||||
|
||||
def to_currency(n, currency='EUR', cents=True, seperator=','):
|
||||
raise NotImplementedError()
|
||||
|
||||
|
||||
class Num2Word_HE(object):
|
||||
def to_cardinal(self, number):
|
||||
return n2w(number)
|
||||
|
||||
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]
|
||||
for num in nums:
|
||||
print(num, yo.to_cardinal(num))
|
||||
# -*- 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 print_function, unicode_literals
|
||||
|
||||
from .utils import get_digits, splitbyx
|
||||
|
||||
ZERO = (u'אפס',)
|
||||
|
||||
ONES = {
|
||||
1: (u'אחד',),
|
||||
2: (u'שנים',),
|
||||
3: (u'שלש',),
|
||||
4: (u'ארבע',),
|
||||
5: (u'חמש',),
|
||||
6: (u'שש',),
|
||||
7: (u'שבע',),
|
||||
8: (u'שמנה',),
|
||||
9: (u'תשע',),
|
||||
}
|
||||
|
||||
TENS = {
|
||||
0: (u'עשר',),
|
||||
1: (u'אחד עשרה',),
|
||||
2: (u'שנים עשרה',),
|
||||
3: (u'שלש עשרה',),
|
||||
4: (u'ארבע עשרה',),
|
||||
5: (u'חמש עשרה',),
|
||||
6: (u'שש עשרה',),
|
||||
7: (u'שבע עשרה',),
|
||||
8: (u'שמנה עשרה',),
|
||||
9: (u'תשע עשרה',),
|
||||
}
|
||||
|
||||
TWENTIES = {
|
||||
2: (u'עשרים',),
|
||||
3: (u'שלשים',),
|
||||
4: (u'ארבעים',),
|
||||
5: (u'חמישים',),
|
||||
6: (u'ששים',),
|
||||
7: (u'שבעים',),
|
||||
8: (u'שמנים',),
|
||||
9: (u'תשעים',),
|
||||
}
|
||||
|
||||
HUNDRED = {
|
||||
1: (u'מאה',),
|
||||
2: (u'מאתיים',),
|
||||
3: (u'מאות',)
|
||||
}
|
||||
|
||||
THOUSANDS = {
|
||||
1: (u'אלף',),
|
||||
2: (u'אלפיים',),
|
||||
}
|
||||
|
||||
AND = u'ו'
|
||||
|
||||
|
||||
def pluralize(n, forms):
|
||||
# gettext implementation:
|
||||
# (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
|
||||
|
||||
return forms[form]
|
||||
|
||||
|
||||
def int2word(n):
|
||||
if n > 9999: # doesn't yet work for numbers this big
|
||||
raise NotImplementedError()
|
||||
|
||||
if n == 0:
|
||||
return ZERO[0]
|
||||
|
||||
words = []
|
||||
|
||||
chunks = list(splitbyx(str(n), 3))
|
||||
i = len(chunks)
|
||||
for x in chunks:
|
||||
i -= 1
|
||||
|
||||
if x == 0:
|
||||
continue
|
||||
|
||||
n1, n2, n3 = get_digits(x)
|
||||
|
||||
if n3 > 0:
|
||||
if n3 <= 2:
|
||||
words.append(HUNDRED[n3][0])
|
||||
else:
|
||||
words.append(ONES[n3][0])
|
||||
words.append(HUNDRED[3][0])
|
||||
|
||||
if n2 > 1:
|
||||
words.append(TWENTIES[n2][0])
|
||||
|
||||
if n2 == 1:
|
||||
words.append(TENS[n1][0])
|
||||
elif n1 > 0 and not (i > 0 and x == 1):
|
||||
words.append(ONES[n1][0])
|
||||
|
||||
if i > 0:
|
||||
if i <= 2:
|
||||
words.append(THOUSANDS[i][0])
|
||||
else:
|
||||
words.append(ONES[i][0])
|
||||
words.append(THOUSANDS[1][0])
|
||||
|
||||
if len(words) > 1:
|
||||
words[-1] = AND + words[-1]
|
||||
return ' '.join(words)
|
||||
|
||||
|
||||
def n2w(n):
|
||||
return int2word(int(n))
|
||||
|
||||
|
||||
def to_currency(n, currency='EUR', cents=True, seperator=','):
|
||||
raise NotImplementedError()
|
||||
|
||||
|
||||
class Num2Word_HE(object):
|
||||
def to_cardinal(self, number):
|
||||
return n2w(number)
|
||||
|
||||
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]
|
||||
for num in nums:
|
||||
print(num, yo.to_cardinal(num))
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
|
||||
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
|
||||
|
||||
|
||||
@@ -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
|
||||
# modify it under the terms of the GNU Lesser General Public
|
||||
# License as published by the Free Software Foundation; either
|
||||
|
||||
@@ -1,175 +1,179 @@
|
||||
# -*- encoding: 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
|
||||
# TODO: replace WINDOWS line endings to UNIX?
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from .base import Num2Word_Base
|
||||
from .utils import get_digits, splitbyx
|
||||
|
||||
ZERO = ('nulis',)
|
||||
|
||||
ONES_FEMININE = {
|
||||
1: ('viena',),
|
||||
2: ('dvi',),
|
||||
3: ('trys',),
|
||||
4: ('keturios',),
|
||||
5: ('penkios',),
|
||||
6: ('šešios',),
|
||||
7: ('septynios',),
|
||||
8: ('aštuonios',),
|
||||
9: ('devynios',),
|
||||
}
|
||||
|
||||
ONES = {
|
||||
1: ('vienas',),
|
||||
2: ('du',),
|
||||
3: ('trys',),
|
||||
4: ('keturi',),
|
||||
5: ('penki',),
|
||||
6: ('šeši',),
|
||||
7: ('septyni',),
|
||||
8: ('aštuoni',),
|
||||
9: ('devyni',),
|
||||
}
|
||||
|
||||
TENS = {
|
||||
0: ('dešimt',),
|
||||
1: ('vienuolika',),
|
||||
2: ('dvylika',),
|
||||
3: ('trylika',),
|
||||
4: ('keturiolika',),
|
||||
5: ('penkiolika',),
|
||||
6: ('šešiolika',),
|
||||
7: ('septyniolika',),
|
||||
8: ('aštuoniolika',),
|
||||
9: ('devyniolika',),
|
||||
}
|
||||
|
||||
TWENTIES = {
|
||||
2: ('dvidešimt',),
|
||||
3: ('trisdešimt',),
|
||||
4: ('keturiasdešimt',),
|
||||
5: ('penkiasdešimt',),
|
||||
6: ('šešiasdešimt',),
|
||||
7: ('septyniasdešimt',),
|
||||
8: ('aštuoniasdešimt',),
|
||||
9: ('devyniasdešimt',),
|
||||
}
|
||||
|
||||
HUNDRED = ('šimtas', 'šimtai')
|
||||
|
||||
THOUSANDS = {
|
||||
1: ('tūkstantis', 'tūkstančiai', 'tūkstančių'),
|
||||
2: ('milijonas', 'milijonai', 'milijonų'),
|
||||
3: ('milijardas', 'milijardai', 'milijardų'),
|
||||
4: ('trilijonas', 'trilijonai', 'trilijonų'),
|
||||
5: ('kvadrilijonas', 'kvadrilijonai', 'kvadrilijonų'),
|
||||
6: ('kvintilijonas', 'kvintilijonai', 'kvintilijonų'),
|
||||
7: ('sikstilijonas', 'sikstilijonai', 'sikstilijonų'),
|
||||
8: ('septilijonas', 'septilijonai', 'septilijonų'),
|
||||
9: ('oktilijonas', 'oktilijonai', 'oktilijonų'),
|
||||
10: ('naintilijonas', 'naintilijonai', 'naintilijonų'),
|
||||
}
|
||||
|
||||
GENERIC_CENTS = ('centas', 'centai', 'centų')
|
||||
|
||||
|
||||
class Num2Word_LT(Num2Word_Base):
|
||||
CURRENCY_FORMS = {
|
||||
'LTL': (('litas', 'litai', 'litų'), GENERIC_CENTS),
|
||||
'EUR': (('euras', 'eurai', 'eurų'), GENERIC_CENTS),
|
||||
'USD': (('doleris', 'doleriai', 'dolerių'), GENERIC_CENTS),
|
||||
'GBP': (
|
||||
('svaras sterlingų', 'svarai sterlingų', 'svarų sterlingų'),
|
||||
('pensas', 'pensai', 'pensų')
|
||||
),
|
||||
'PLN': (
|
||||
('zlotas', 'zlotai', 'zlotų'),
|
||||
('grašis', 'grašiai', 'grašių')),
|
||||
'RUB': (
|
||||
('rublis', 'rubliai', 'rublių'),
|
||||
('kapeika', 'kapeikos', 'kapeikų')
|
||||
),
|
||||
}
|
||||
|
||||
def setup(self):
|
||||
self.negword = "minus"
|
||||
self.pointword = "kablelis"
|
||||
|
||||
def pluralize(self, n, forms):
|
||||
n1, n2, n3 = get_digits(n)
|
||||
if n2 == 1 or n1 == 0 or n == 0:
|
||||
return forms[2]
|
||||
elif n1 == 1:
|
||||
return forms[0]
|
||||
else:
|
||||
return forms[1]
|
||||
|
||||
def to_cardinal(self, number):
|
||||
n = str(number).replace(',', '.')
|
||||
base_str, n = self.parse_minus(n)
|
||||
if '.' in n:
|
||||
left, right = n.split('.')
|
||||
return '%s%s %s %s' % (
|
||||
base_str,
|
||||
self._int2word(int(left)),
|
||||
self.pointword,
|
||||
self._int2word(int(right))
|
||||
)
|
||||
else:
|
||||
return "%s%s" % (base_str, self._int2word(int(n)))
|
||||
|
||||
def to_ordinal(self, number):
|
||||
raise NotImplementedError()
|
||||
|
||||
def _cents_verbose(self, number, currency):
|
||||
return self._int2word(number, currency == 'RUB')
|
||||
|
||||
def _int2word(self, n, feminine=False):
|
||||
if n == 0:
|
||||
return ZERO[0]
|
||||
|
||||
words = []
|
||||
chunks = list(splitbyx(str(n), 3))
|
||||
i = len(chunks)
|
||||
|
||||
for x in chunks:
|
||||
i -= 1
|
||||
n1, n2, n3 = get_digits(x)
|
||||
|
||||
if n3 > 0:
|
||||
words.append(ONES[n3][0])
|
||||
if n3 > 1:
|
||||
words.append(HUNDRED[1])
|
||||
else:
|
||||
words.append(HUNDRED[0])
|
||||
|
||||
if n2 > 1:
|
||||
words.append(TWENTIES[n2][0])
|
||||
|
||||
if n2 == 1:
|
||||
words.append(TENS[n1][0])
|
||||
elif n1 > 0:
|
||||
if (i == 1 or feminine and i == 0) and n < 1000:
|
||||
words.append(ONES_FEMININE[n1][0])
|
||||
else:
|
||||
words.append(ONES[n1][0])
|
||||
|
||||
if i > 0:
|
||||
words.append(self.pluralize(x, THOUSANDS[i]))
|
||||
|
||||
return ' '.join(words)
|
||||
# -*- 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 .base import Num2Word_Base
|
||||
from .utils import get_digits, splitbyx
|
||||
|
||||
ZERO = ('nulis',)
|
||||
|
||||
ONES_FEMININE = {
|
||||
1: ('viena',),
|
||||
2: ('dvi',),
|
||||
3: ('trys',),
|
||||
4: ('keturios',),
|
||||
5: ('penkios',),
|
||||
6: ('šešios',),
|
||||
7: ('septynios',),
|
||||
8: ('aštuonios',),
|
||||
9: ('devynios',),
|
||||
}
|
||||
|
||||
ONES = {
|
||||
1: ('vienas',),
|
||||
2: ('du',),
|
||||
3: ('trys',),
|
||||
4: ('keturi',),
|
||||
5: ('penki',),
|
||||
6: ('šeši',),
|
||||
7: ('septyni',),
|
||||
8: ('aštuoni',),
|
||||
9: ('devyni',),
|
||||
}
|
||||
|
||||
TENS = {
|
||||
0: ('dešimt',),
|
||||
1: ('vienuolika',),
|
||||
2: ('dvylika',),
|
||||
3: ('trylika',),
|
||||
4: ('keturiolika',),
|
||||
5: ('penkiolika',),
|
||||
6: ('šešiolika',),
|
||||
7: ('septyniolika',),
|
||||
8: ('aštuoniolika',),
|
||||
9: ('devyniolika',),
|
||||
}
|
||||
|
||||
TWENTIES = {
|
||||
2: ('dvidešimt',),
|
||||
3: ('trisdešimt',),
|
||||
4: ('keturiasdešimt',),
|
||||
5: ('penkiasdešimt',),
|
||||
6: ('šešiasdešimt',),
|
||||
7: ('septyniasdešimt',),
|
||||
8: ('aštuoniasdešimt',),
|
||||
9: ('devyniasdešimt',),
|
||||
}
|
||||
|
||||
HUNDRED = ('šimtas', 'šimtai')
|
||||
|
||||
THOUSANDS = {
|
||||
1: ('tūkstantis', 'tūkstančiai', 'tūkstančių'),
|
||||
2: ('milijonas', 'milijonai', 'milijonų'),
|
||||
3: ('milijardas', 'milijardai', 'milijardų'),
|
||||
4: ('trilijonas', 'trilijonai', 'trilijonų'),
|
||||
5: ('kvadrilijonas', 'kvadrilijonai', 'kvadrilijonų'),
|
||||
6: ('kvintilijonas', 'kvintilijonai', 'kvintilijonų'),
|
||||
7: ('sikstilijonas', 'sikstilijonai', 'sikstilijonų'),
|
||||
8: ('septilijonas', 'septilijonai', 'septilijonų'),
|
||||
9: ('oktilijonas', 'oktilijonai', 'oktilijonų'),
|
||||
10: ('naintilijonas', 'naintilijonai', 'naintilijonų'),
|
||||
}
|
||||
|
||||
GENERIC_CENTS = ('centas', 'centai', 'centų')
|
||||
|
||||
|
||||
class Num2Word_LT(Num2Word_Base):
|
||||
CURRENCY_FORMS = {
|
||||
'LTL': (('litas', 'litai', 'litų'), GENERIC_CENTS),
|
||||
'EUR': (('euras', 'eurai', 'eurų'), GENERIC_CENTS),
|
||||
'USD': (('doleris', 'doleriai', 'dolerių'), GENERIC_CENTS),
|
||||
'GBP': (
|
||||
('svaras sterlingų', 'svarai sterlingų', 'svarų sterlingų'),
|
||||
('pensas', 'pensai', 'pensų')
|
||||
),
|
||||
'PLN': (
|
||||
('zlotas', 'zlotai', 'zlotų'),
|
||||
('grašis', 'grašiai', 'grašių')),
|
||||
'RUB': (
|
||||
('rublis', 'rubliai', 'rublių'),
|
||||
('kapeika', 'kapeikos', 'kapeikų')
|
||||
),
|
||||
}
|
||||
|
||||
def setup(self):
|
||||
self.negword = "minus"
|
||||
self.pointword = "kablelis"
|
||||
|
||||
def pluralize(self, n, forms):
|
||||
n1, n2, n3 = get_digits(n)
|
||||
if n2 == 1 or n1 == 0 or n == 0:
|
||||
return forms[2]
|
||||
elif n1 == 1:
|
||||
return forms[0]
|
||||
else:
|
||||
return forms[1]
|
||||
|
||||
def to_cardinal(self, number):
|
||||
n = str(number).replace(',', '.')
|
||||
base_str, n = self.parse_minus(n)
|
||||
if '.' in n:
|
||||
left, right = n.split('.')
|
||||
return '%s%s %s %s' % (
|
||||
base_str,
|
||||
self._int2word(int(left)),
|
||||
self.pointword,
|
||||
self._int2word(int(right))
|
||||
)
|
||||
else:
|
||||
return "%s%s" % (base_str, self._int2word(int(n)))
|
||||
|
||||
def to_ordinal(self, number):
|
||||
raise NotImplementedError()
|
||||
|
||||
def _cents_verbose(self, number, currency):
|
||||
return self._int2word(number, currency == 'RUB')
|
||||
|
||||
def _int2word(self, n, feminine=False):
|
||||
if n == 0:
|
||||
return ZERO[0]
|
||||
|
||||
words = []
|
||||
chunks = list(splitbyx(str(n), 3))
|
||||
i = len(chunks)
|
||||
|
||||
for x in chunks:
|
||||
i -= 1
|
||||
|
||||
if x == 0:
|
||||
continue
|
||||
|
||||
n1, n2, n3 = get_digits(x)
|
||||
|
||||
if n3 > 0:
|
||||
words.append(ONES[n3][0])
|
||||
if n3 > 1:
|
||||
words.append(HUNDRED[1])
|
||||
else:
|
||||
words.append(HUNDRED[0])
|
||||
|
||||
if n2 > 1:
|
||||
words.append(TWENTIES[n2][0])
|
||||
|
||||
if n2 == 1:
|
||||
words.append(TENS[n1][0])
|
||||
elif n1 > 0:
|
||||
if (i == 1 or feminine and i == 0) and n < 1000:
|
||||
words.append(ONES_FEMININE[n1][0])
|
||||
else:
|
||||
words.append(ONES[n1][0])
|
||||
|
||||
if i > 0:
|
||||
words.append(self.pluralize(x, THOUSANDS[i]))
|
||||
|
||||
return ' '.join(words)
|
||||
|
||||
@@ -1,182 +1,186 @@
|
||||
# -*- encoding: 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
|
||||
# TODO: replace WINDOWS line endings to UNIX?
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from .base import Num2Word_Base
|
||||
from .utils import get_digits, splitbyx
|
||||
|
||||
ZERO = ('nulle',)
|
||||
|
||||
ONES = {
|
||||
1: ('viens',),
|
||||
2: ('divi',),
|
||||
3: ('trīs',),
|
||||
4: ('četri',),
|
||||
5: ('pieci',),
|
||||
6: ('seši',),
|
||||
7: ('septiņi',),
|
||||
8: ('astoņi',),
|
||||
9: ('deviņi',),
|
||||
}
|
||||
|
||||
TENS = {
|
||||
0: ('desmit',),
|
||||
1: ('vienpadsmit',),
|
||||
2: ('divpadsmit',),
|
||||
3: ('trīspadsmit',),
|
||||
4: ('četrpadsmit',),
|
||||
5: ('piecpadsmit',),
|
||||
6: ('sešpadsmit',),
|
||||
7: ('septiņpadsmit',),
|
||||
8: ('astoņpadsmit',),
|
||||
9: ('deviņpadsmit',),
|
||||
}
|
||||
|
||||
TWENTIES = {
|
||||
2: ('divdesmit',),
|
||||
3: ('trīsdesmit',),
|
||||
4: ('četrdesmit',),
|
||||
5: ('piecdesmit',),
|
||||
6: ('sešdesmit',),
|
||||
7: ('septiņdesmit',),
|
||||
8: ('astoņdesmit',),
|
||||
9: ('deviņdesmit',),
|
||||
}
|
||||
|
||||
HUNDRED = ('simts', 'simti', 'simtu')
|
||||
|
||||
THOUSANDS = {
|
||||
1: ('tūkstotis', 'tūkstoši', 'tūkstošu'),
|
||||
2: ('miljons', 'miljoni', 'miljonu'),
|
||||
3: ('miljards', 'miljardi', 'miljardu'),
|
||||
4: ('triljons', 'triljoni', 'triljonu'),
|
||||
5: ('kvadriljons', 'kvadriljoni', 'kvadriljonu'),
|
||||
6: ('kvintiljons', 'kvintiljoni', 'kvintiljonu'),
|
||||
7: ('sikstiljons', 'sikstiljoni', 'sikstiljonu'),
|
||||
8: ('septiljons', 'septiljoni', 'septiljonu'),
|
||||
9: ('oktiljons', 'oktiljoni', 'oktiljonu'),
|
||||
10: ('nontiljons', 'nontiljoni', 'nontiljonu'),
|
||||
}
|
||||
|
||||
GENERIC_DOLLARS = ('dolārs', 'dolāri', 'dolāru')
|
||||
GENERIC_CENTS = ('cents', 'centi', 'centu')
|
||||
|
||||
GENERIC_KRONA = ('krona', 'kronas', 'kronu')
|
||||
GENERIC_ERA = ('ēre', 'ēras', 'ēru')
|
||||
|
||||
|
||||
class Num2Word_LV(Num2Word_Base):
|
||||
"""
|
||||
Sadly we have a legal form (used in legal and finance documents):
|
||||
http://www.eiro.lv/files/upload/files/Eiro_rakstiba-1.pdf
|
||||
https://likumi.lv/doc.php?id=254741
|
||||
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
|
||||
"""
|
||||
CURRENCY_FORMS = {
|
||||
'AUD': (GENERIC_DOLLARS, GENERIC_CENTS),
|
||||
'CAD': (GENERIC_DOLLARS, GENERIC_CENTS),
|
||||
# repalced by EUR
|
||||
'EEK': (GENERIC_KRONA, GENERIC_CENTS),
|
||||
'EUR': (('eiro', 'eiro', 'eiro'), GENERIC_CENTS),
|
||||
'EUR_LEGAL': (('euro', 'euro', 'euro'), GENERIC_CENTS),
|
||||
'GBP': (
|
||||
('sterliņu mārciņa', 'sterliņu mārciņas', 'sterliņu mārciņu'),
|
||||
('penss', 'pensi', 'pensu')),
|
||||
# replaced by EUR
|
||||
'LTL': (('lits', 'liti', 'litu'), GENERIC_CENTS),
|
||||
# replaced by EUR
|
||||
'LVL': (('lats', 'lati', 'latu'),
|
||||
('santīms', 'santīmi', 'santīmu')),
|
||||
'USD': (GENERIC_DOLLARS, GENERIC_CENTS),
|
||||
'RUB': (('rublis', 'rubļi', 'rubļu'),
|
||||
('kapeika', 'kapeikas', 'kapeiku')),
|
||||
'SEK': (GENERIC_KRONA, GENERIC_ERA),
|
||||
'NOK': (GENERIC_KRONA, GENERIC_ERA),
|
||||
'PLN': (('zlots', 'zloti', 'zlotu'),
|
||||
('grasis', 'graši', 'grašu')),
|
||||
}
|
||||
|
||||
CURRENCY_ADJECTIVES = {
|
||||
'AUD': 'Austrālijas',
|
||||
'CAD': 'Kanādas',
|
||||
'EEK': 'Igaunijas',
|
||||
'USD': 'ASV',
|
||||
'RUB': 'Kreivijas',
|
||||
'SEK': 'Zviedrijas',
|
||||
'NOK': 'Norvēģijas',
|
||||
}
|
||||
|
||||
def setup(self):
|
||||
self.negword = "mīnus"
|
||||
self.pointword = "komats"
|
||||
|
||||
def to_cardinal(self, number):
|
||||
n = str(number).replace(',', '.')
|
||||
base_str, n = self.parse_minus(n)
|
||||
if '.' in n:
|
||||
left, right = n.split('.')
|
||||
return '%s%s %s %s' % (
|
||||
base_str,
|
||||
self._int2word(int(left)),
|
||||
self.pointword,
|
||||
self._int2word(int(right))
|
||||
)
|
||||
else:
|
||||
return "%s%s" % (base_str, self._int2word(int(n)))
|
||||
|
||||
def pluralize(self, n, forms):
|
||||
form = 0 if (n % 10 == 1 and n % 100 != 11) else 1 if n != 0 else 2
|
||||
return forms[form]
|
||||
|
||||
def to_ordinal(self, number):
|
||||
raise NotImplementedError()
|
||||
|
||||
def _int2word(self, n):
|
||||
if n == 0:
|
||||
return ZERO[0]
|
||||
|
||||
words = []
|
||||
chunks = list(splitbyx(str(n), 3))
|
||||
i = len(chunks)
|
||||
for x in chunks:
|
||||
i -= 1
|
||||
n1, n2, n3 = get_digits(x)
|
||||
|
||||
if n3 > 0:
|
||||
if n3 == 1 and n2 == 0 and n1 > 0:
|
||||
words.append(HUNDRED[2])
|
||||
elif n3 > 1:
|
||||
words.append(ONES[n3][0])
|
||||
words.append(HUNDRED[1])
|
||||
else:
|
||||
words.append(HUNDRED[0])
|
||||
|
||||
if n2 > 1:
|
||||
words.append(TWENTIES[n2][0])
|
||||
|
||||
if n2 == 1:
|
||||
words.append(TENS[n1][0])
|
||||
elif n1 > 0 and not (i > 0 and x == 1):
|
||||
words.append(ONES[n1][0])
|
||||
|
||||
if i > 0 and x != 0:
|
||||
words.append(self.pluralize(x, THOUSANDS[i]))
|
||||
|
||||
return ' '.join(words)
|
||||
# -*- 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 .base import Num2Word_Base
|
||||
from .utils import get_digits, splitbyx
|
||||
|
||||
ZERO = ('nulle',)
|
||||
|
||||
ONES = {
|
||||
1: ('viens',),
|
||||
2: ('divi',),
|
||||
3: ('trīs',),
|
||||
4: ('četri',),
|
||||
5: ('pieci',),
|
||||
6: ('seši',),
|
||||
7: ('septiņi',),
|
||||
8: ('astoņi',),
|
||||
9: ('deviņi',),
|
||||
}
|
||||
|
||||
TENS = {
|
||||
0: ('desmit',),
|
||||
1: ('vienpadsmit',),
|
||||
2: ('divpadsmit',),
|
||||
3: ('trīspadsmit',),
|
||||
4: ('četrpadsmit',),
|
||||
5: ('piecpadsmit',),
|
||||
6: ('sešpadsmit',),
|
||||
7: ('septiņpadsmit',),
|
||||
8: ('astoņpadsmit',),
|
||||
9: ('deviņpadsmit',),
|
||||
}
|
||||
|
||||
TWENTIES = {
|
||||
2: ('divdesmit',),
|
||||
3: ('trīsdesmit',),
|
||||
4: ('četrdesmit',),
|
||||
5: ('piecdesmit',),
|
||||
6: ('sešdesmit',),
|
||||
7: ('septiņdesmit',),
|
||||
8: ('astoņdesmit',),
|
||||
9: ('deviņdesmit',),
|
||||
}
|
||||
|
||||
HUNDRED = ('simts', 'simti', 'simtu')
|
||||
|
||||
THOUSANDS = {
|
||||
1: ('tūkstotis', 'tūkstoši', 'tūkstošu'),
|
||||
2: ('miljons', 'miljoni', 'miljonu'),
|
||||
3: ('miljards', 'miljardi', 'miljardu'),
|
||||
4: ('triljons', 'triljoni', 'triljonu'),
|
||||
5: ('kvadriljons', 'kvadriljoni', 'kvadriljonu'),
|
||||
6: ('kvintiljons', 'kvintiljoni', 'kvintiljonu'),
|
||||
7: ('sikstiljons', 'sikstiljoni', 'sikstiljonu'),
|
||||
8: ('septiljons', 'septiljoni', 'septiljonu'),
|
||||
9: ('oktiljons', 'oktiljoni', 'oktiljonu'),
|
||||
10: ('nontiljons', 'nontiljoni', 'nontiljonu'),
|
||||
}
|
||||
|
||||
GENERIC_DOLLARS = ('dolārs', 'dolāri', 'dolāru')
|
||||
GENERIC_CENTS = ('cents', 'centi', 'centu')
|
||||
|
||||
GENERIC_KRONA = ('krona', 'kronas', 'kronu')
|
||||
GENERIC_ERA = ('ēre', 'ēras', 'ēru')
|
||||
|
||||
|
||||
class Num2Word_LV(Num2Word_Base):
|
||||
"""
|
||||
Sadly we have a legal form (used in legal and finance documents):
|
||||
http://www.eiro.lv/files/upload/files/Eiro_rakstiba-1.pdf
|
||||
https://likumi.lv/doc.php?id=254741
|
||||
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
|
||||
"""
|
||||
CURRENCY_FORMS = {
|
||||
'AUD': (GENERIC_DOLLARS, GENERIC_CENTS),
|
||||
'CAD': (GENERIC_DOLLARS, GENERIC_CENTS),
|
||||
# repalced by EUR
|
||||
'EEK': (GENERIC_KRONA, GENERIC_CENTS),
|
||||
'EUR': (('eiro', 'eiro', 'eiro'), GENERIC_CENTS),
|
||||
'EUR_LEGAL': (('euro', 'euro', 'euro'), GENERIC_CENTS),
|
||||
'GBP': (
|
||||
('sterliņu mārciņa', 'sterliņu mārciņas', 'sterliņu mārciņu'),
|
||||
('penss', 'pensi', 'pensu')),
|
||||
# replaced by EUR
|
||||
'LTL': (('lits', 'liti', 'litu'), GENERIC_CENTS),
|
||||
# replaced by EUR
|
||||
'LVL': (('lats', 'lati', 'latu'),
|
||||
('santīms', 'santīmi', 'santīmu')),
|
||||
'USD': (GENERIC_DOLLARS, GENERIC_CENTS),
|
||||
'RUB': (('rublis', 'rubļi', 'rubļu'),
|
||||
('kapeika', 'kapeikas', 'kapeiku')),
|
||||
'SEK': (GENERIC_KRONA, GENERIC_ERA),
|
||||
'NOK': (GENERIC_KRONA, GENERIC_ERA),
|
||||
'PLN': (('zlots', 'zloti', 'zlotu'),
|
||||
('grasis', 'graši', 'grašu')),
|
||||
}
|
||||
|
||||
CURRENCY_ADJECTIVES = {
|
||||
'AUD': 'Austrālijas',
|
||||
'CAD': 'Kanādas',
|
||||
'EEK': 'Igaunijas',
|
||||
'USD': 'ASV',
|
||||
'RUB': 'Kreivijas',
|
||||
'SEK': 'Zviedrijas',
|
||||
'NOK': 'Norvēģijas',
|
||||
}
|
||||
|
||||
def setup(self):
|
||||
self.negword = "mīnus"
|
||||
self.pointword = "komats"
|
||||
|
||||
def to_cardinal(self, number):
|
||||
n = str(number).replace(',', '.')
|
||||
base_str, n = self.parse_minus(n)
|
||||
if '.' in n:
|
||||
left, right = n.split('.')
|
||||
return '%s%s %s %s' % (
|
||||
base_str,
|
||||
self._int2word(int(left)),
|
||||
self.pointword,
|
||||
self._int2word(int(right))
|
||||
)
|
||||
else:
|
||||
return "%s%s" % (base_str, self._int2word(int(n)))
|
||||
|
||||
def pluralize(self, n, forms):
|
||||
form = 0 if (n % 10 == 1 and n % 100 != 11) else 1 if n != 0 else 2
|
||||
return forms[form]
|
||||
|
||||
def to_ordinal(self, number):
|
||||
raise NotImplementedError()
|
||||
|
||||
def _int2word(self, n):
|
||||
if n == 0:
|
||||
return ZERO[0]
|
||||
|
||||
words = []
|
||||
chunks = list(splitbyx(str(n), 3))
|
||||
i = len(chunks)
|
||||
for x in chunks:
|
||||
i -= 1
|
||||
|
||||
if x == 0:
|
||||
continue
|
||||
|
||||
n1, n2, n3 = get_digits(x)
|
||||
|
||||
if n3 > 0:
|
||||
if n3 == 1 and n2 == 0 and n1 > 0:
|
||||
words.append(HUNDRED[2])
|
||||
elif n3 > 1:
|
||||
words.append(ONES[n3][0])
|
||||
words.append(HUNDRED[1])
|
||||
else:
|
||||
words.append(HUNDRED[0])
|
||||
|
||||
if n2 > 1:
|
||||
words.append(TWENTIES[n2][0])
|
||||
|
||||
if n2 == 1:
|
||||
words.append(TENS[n1][0])
|
||||
elif n1 > 0 and not (i > 0 and x == 1):
|
||||
words.append(ONES[n1][0])
|
||||
|
||||
if i > 0:
|
||||
words.append(self.pluralize(x, THOUSANDS[i]))
|
||||
|
||||
return ' '.join(words)
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
|
||||
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2003, Taro Ogawa. 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
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
# MA 02110-1301 USA
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from .base import Num2Word_Base
|
||||
@@ -66,7 +67,7 @@ HUNDREDS = {
|
||||
6: ('sześćset',),
|
||||
7: ('siedemset',),
|
||||
8: ('osiemset',),
|
||||
9: ('dziewęćset',),
|
||||
9: ('dziewięćset',),
|
||||
}
|
||||
|
||||
THOUSANDS = {
|
||||
@@ -141,6 +142,10 @@ class Num2Word_PL(Num2Word_Base):
|
||||
i = len(chunks)
|
||||
for x in chunks:
|
||||
i -= 1
|
||||
|
||||
if x == 0:
|
||||
continue
|
||||
|
||||
n1, n2, n3 = get_digits(x)
|
||||
|
||||
if n3 > 0:
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
|
||||
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright (c) 2003, Taro Ogawa. 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
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
# MA 02110-1301 USA
|
||||
|
||||
from __future__ import division, unicode_literals
|
||||
|
||||
import re
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
|
||||
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
|
||||
|
||||
|
||||
@@ -1,229 +1,234 @@
|
||||
# -*- encoding: 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 .base import Num2Word_Base
|
||||
from .utils import get_digits, splitbyx
|
||||
|
||||
ZERO = ('ноль',)
|
||||
|
||||
ONES_FEMININE = {
|
||||
1: ('одна',),
|
||||
2: ('две',),
|
||||
3: ('три',),
|
||||
4: ('четыре',),
|
||||
5: ('пять',),
|
||||
6: ('шесть',),
|
||||
7: ('семь',),
|
||||
8: ('восемь',),
|
||||
9: ('девять',),
|
||||
}
|
||||
|
||||
ONES = {
|
||||
1: ('один',),
|
||||
2: ('два',),
|
||||
3: ('три',),
|
||||
4: ('четыре',),
|
||||
5: ('пять',),
|
||||
6: ('шесть',),
|
||||
7: ('семь',),
|
||||
8: ('восемь',),
|
||||
9: ('девять',),
|
||||
}
|
||||
|
||||
TENS = {
|
||||
0: ('десять',),
|
||||
1: ('одиннадцать',),
|
||||
2: ('двенадцать',),
|
||||
3: ('тринадцать',),
|
||||
4: ('четырнадцать',),
|
||||
5: ('пятнадцать',),
|
||||
6: ('шестнадцать',),
|
||||
7: ('семнадцать',),
|
||||
8: ('восемнадцать',),
|
||||
9: ('девятнадцать',),
|
||||
}
|
||||
|
||||
TWENTIES = {
|
||||
2: ('двадцать',),
|
||||
3: ('тридцать',),
|
||||
4: ('сорок',),
|
||||
5: ('пятьдесят',),
|
||||
6: ('шестьдесят',),
|
||||
7: ('семьдесят',),
|
||||
8: ('восемьдесят',),
|
||||
9: ('девяносто',),
|
||||
}
|
||||
|
||||
HUNDREDS = {
|
||||
1: ('сто',),
|
||||
2: ('двести',),
|
||||
3: ('триста',),
|
||||
4: ('четыреста',),
|
||||
5: ('пятьсот',),
|
||||
6: ('шестьсот',),
|
||||
7: ('семьсот',),
|
||||
8: ('восемьсот',),
|
||||
9: ('девятьсот',),
|
||||
}
|
||||
|
||||
THOUSANDS = {
|
||||
1: ('тысяча', 'тысячи', 'тысяч'), # 10^3
|
||||
2: ('миллион', 'миллиона', 'миллионов'), # 10^6
|
||||
3: ('миллиард', 'миллиарда', 'миллиардов'), # 10^9
|
||||
4: ('триллион', 'триллиона', 'триллионов'), # 10^12
|
||||
5: ('квадриллион', 'квадриллиона', 'квадриллионов'), # 10^15
|
||||
6: ('квинтиллион', 'квинтиллиона', 'квинтиллионов'), # 10^18
|
||||
7: ('секстиллион', 'секстиллиона', 'секстиллионов'), # 10^21
|
||||
8: ('септиллион', 'септиллиона', 'септиллионов'), # 10^24
|
||||
9: ('октиллион', 'октиллиона', 'октиллионов'), # 10^27
|
||||
10: ('нониллион', 'нониллиона', 'нониллионов'), # 10^30
|
||||
}
|
||||
|
||||
|
||||
class Num2Word_RU(Num2Word_Base):
|
||||
CURRENCY_FORMS = {
|
||||
'RUB': (
|
||||
('рубль', 'рубля', 'рублей'), ('копейка', 'копейки', 'копеек')
|
||||
),
|
||||
'EUR': (
|
||||
('евро', 'евро', 'евро'), ('цент', 'цента', 'центов')
|
||||
),
|
||||
'USD': (
|
||||
('доллар', 'доллара', 'долларов'), ('цент', 'цента', 'центов')
|
||||
),
|
||||
}
|
||||
|
||||
def setup(self):
|
||||
self.negword = "минус"
|
||||
self.pointword = "запятая"
|
||||
self.ords = {"ноль": "нулевой",
|
||||
"один": "первый",
|
||||
"два": "второй",
|
||||
"три": "третий",
|
||||
"четыре": "четвертый",
|
||||
"пять": "пятый",
|
||||
"шесть": "шестой",
|
||||
"семь": "седьмой",
|
||||
"восемь": "восьмой",
|
||||
"девять": "девятый",
|
||||
"сто": "сотый"}
|
||||
self.ords_feminine = {"один": "",
|
||||
"одна": "",
|
||||
"две": "двух",
|
||||
"три": "трёх",
|
||||
"четыре": "четырёх",
|
||||
"пять": "пяти",
|
||||
"шесть": "шести",
|
||||
"семь": "семи",
|
||||
"восемь": "восьми",
|
||||
"девять": "девяти"}
|
||||
|
||||
def to_cardinal(self, number):
|
||||
n = str(number).replace(',', '.')
|
||||
if '.' in n:
|
||||
left, right = n.split('.')
|
||||
return u'%s %s %s' % (
|
||||
self._int2word(int(left)),
|
||||
self.pointword,
|
||||
self._int2word(int(right))
|
||||
)
|
||||
else:
|
||||
return self._int2word(int(n))
|
||||
|
||||
def pluralize(self, n, forms):
|
||||
if n % 100 < 10 or n % 100 > 20:
|
||||
if n % 10 == 1:
|
||||
form = 0
|
||||
elif 5 > n % 10 > 1:
|
||||
form = 1
|
||||
else:
|
||||
form = 2
|
||||
else:
|
||||
form = 2
|
||||
return forms[form]
|
||||
|
||||
def to_ordinal(self, number):
|
||||
self.verify_ordinal(number)
|
||||
outwords = self.to_cardinal(number).split(" ")
|
||||
lastword = outwords[-1].lower()
|
||||
try:
|
||||
if len(outwords) > 1:
|
||||
if outwords[-2] in self.ords_feminine:
|
||||
outwords[-2] = self.ords_feminine.get(
|
||||
outwords[-2], outwords[-2])
|
||||
elif outwords[-2] == 'десять':
|
||||
outwords[-2] = outwords[-2][:-1] + 'и'
|
||||
if len(outwords) == 3:
|
||||
if outwords[-3] in ['один', 'одна']:
|
||||
outwords[-3] = ''
|
||||
lastword = self.ords[lastword]
|
||||
except KeyError:
|
||||
if lastword[:-3] in self.ords_feminine:
|
||||
lastword = self.ords_feminine.get(
|
||||
lastword[:-3], lastword) + "сотый"
|
||||
elif lastword[-1] == "ь" or lastword[-2] == "т":
|
||||
lastword = lastword[:-1] + "ый"
|
||||
elif lastword[-1] == "к":
|
||||
lastword = lastword + "овой"
|
||||
elif lastword[-5:] == "десят":
|
||||
lastword = lastword.replace('ь', 'и') + 'ый'
|
||||
elif lastword[-2] == "ч" or lastword[-1] == "ч":
|
||||
if lastword[-2] == "ч":
|
||||
lastword = lastword[:-1] + "ный"
|
||||
if lastword[-1] == "ч":
|
||||
lastword = lastword + "ный"
|
||||
elif lastword[-1] == "н" or lastword[-2] == "н":
|
||||
lastword = lastword[:lastword.rfind('н') + 1] + "ный"
|
||||
elif lastword[-1] == "д" or lastword[-2] == "д":
|
||||
lastword = lastword[:lastword.rfind('д') + 1] + "ный"
|
||||
outwords[-1] = self.title(lastword)
|
||||
return " ".join(outwords).strip()
|
||||
|
||||
def _cents_verbose(self, number, currency):
|
||||
return self._int2word(number, currency == 'RUB')
|
||||
|
||||
def _int2word(self, n, feminine=False):
|
||||
if n < 0:
|
||||
return ' '.join([self.negword, self._int2word(abs(n))])
|
||||
|
||||
if n == 0:
|
||||
return ZERO[0]
|
||||
|
||||
words = []
|
||||
chunks = list(splitbyx(str(n), 3))
|
||||
i = len(chunks)
|
||||
for x in chunks:
|
||||
i -= 1
|
||||
n1, n2, n3 = get_digits(x)
|
||||
|
||||
if n3 > 0:
|
||||
words.append(HUNDREDS[n3][0])
|
||||
|
||||
if n2 > 1:
|
||||
words.append(TWENTIES[n2][0])
|
||||
|
||||
if n2 == 1:
|
||||
words.append(TENS[n1][0])
|
||||
elif n1 > 0:
|
||||
ones = ONES_FEMININE if i == 1 or feminine and i == 0 else ONES
|
||||
words.append(ones[n1][0])
|
||||
|
||||
if i > 0 and x != 0:
|
||||
words.append(self.pluralize(x, THOUSANDS[i]))
|
||||
|
||||
return ' '.join(words)
|
||||
# -*- 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 .base import Num2Word_Base
|
||||
from .utils import get_digits, splitbyx
|
||||
|
||||
ZERO = ('ноль',)
|
||||
|
||||
ONES_FEMININE = {
|
||||
1: ('одна',),
|
||||
2: ('две',),
|
||||
3: ('три',),
|
||||
4: ('четыре',),
|
||||
5: ('пять',),
|
||||
6: ('шесть',),
|
||||
7: ('семь',),
|
||||
8: ('восемь',),
|
||||
9: ('девять',),
|
||||
}
|
||||
|
||||
ONES = {
|
||||
1: ('один',),
|
||||
2: ('два',),
|
||||
3: ('три',),
|
||||
4: ('четыре',),
|
||||
5: ('пять',),
|
||||
6: ('шесть',),
|
||||
7: ('семь',),
|
||||
8: ('восемь',),
|
||||
9: ('девять',),
|
||||
}
|
||||
|
||||
TENS = {
|
||||
0: ('десять',),
|
||||
1: ('одиннадцать',),
|
||||
2: ('двенадцать',),
|
||||
3: ('тринадцать',),
|
||||
4: ('четырнадцать',),
|
||||
5: ('пятнадцать',),
|
||||
6: ('шестнадцать',),
|
||||
7: ('семнадцать',),
|
||||
8: ('восемнадцать',),
|
||||
9: ('девятнадцать',),
|
||||
}
|
||||
|
||||
TWENTIES = {
|
||||
2: ('двадцать',),
|
||||
3: ('тридцать',),
|
||||
4: ('сорок',),
|
||||
5: ('пятьдесят',),
|
||||
6: ('шестьдесят',),
|
||||
7: ('семьдесят',),
|
||||
8: ('восемьдесят',),
|
||||
9: ('девяносто',),
|
||||
}
|
||||
|
||||
HUNDREDS = {
|
||||
1: ('сто',),
|
||||
2: ('двести',),
|
||||
3: ('триста',),
|
||||
4: ('четыреста',),
|
||||
5: ('пятьсот',),
|
||||
6: ('шестьсот',),
|
||||
7: ('семьсот',),
|
||||
8: ('восемьсот',),
|
||||
9: ('девятьсот',),
|
||||
}
|
||||
|
||||
THOUSANDS = {
|
||||
1: ('тысяча', 'тысячи', 'тысяч'), # 10^3
|
||||
2: ('миллион', 'миллиона', 'миллионов'), # 10^6
|
||||
3: ('миллиард', 'миллиарда', 'миллиардов'), # 10^9
|
||||
4: ('триллион', 'триллиона', 'триллионов'), # 10^12
|
||||
5: ('квадриллион', 'квадриллиона', 'квадриллионов'), # 10^15
|
||||
6: ('квинтиллион', 'квинтиллиона', 'квинтиллионов'), # 10^18
|
||||
7: ('секстиллион', 'секстиллиона', 'секстиллионов'), # 10^21
|
||||
8: ('септиллион', 'септиллиона', 'септиллионов'), # 10^24
|
||||
9: ('октиллион', 'октиллиона', 'октиллионов'), # 10^27
|
||||
10: ('нониллион', 'нониллиона', 'нониллионов'), # 10^30
|
||||
}
|
||||
|
||||
|
||||
class Num2Word_RU(Num2Word_Base):
|
||||
CURRENCY_FORMS = {
|
||||
'RUB': (
|
||||
('рубль', 'рубля', 'рублей'), ('копейка', 'копейки', 'копеек')
|
||||
),
|
||||
'EUR': (
|
||||
('евро', 'евро', 'евро'), ('цент', 'цента', 'центов')
|
||||
),
|
||||
'USD': (
|
||||
('доллар', 'доллара', 'долларов'), ('цент', 'цента', 'центов')
|
||||
),
|
||||
}
|
||||
|
||||
def setup(self):
|
||||
self.negword = "минус"
|
||||
self.pointword = "запятая"
|
||||
self.ords = {"ноль": "нулевой",
|
||||
"один": "первый",
|
||||
"два": "второй",
|
||||
"три": "третий",
|
||||
"четыре": "четвертый",
|
||||
"пять": "пятый",
|
||||
"шесть": "шестой",
|
||||
"семь": "седьмой",
|
||||
"восемь": "восьмой",
|
||||
"девять": "девятый",
|
||||
"сто": "сотый"}
|
||||
self.ords_feminine = {"один": "",
|
||||
"одна": "",
|
||||
"две": "двух",
|
||||
"три": "трёх",
|
||||
"четыре": "четырёх",
|
||||
"пять": "пяти",
|
||||
"шесть": "шести",
|
||||
"семь": "семи",
|
||||
"восемь": "восьми",
|
||||
"девять": "девяти"}
|
||||
|
||||
def to_cardinal(self, number):
|
||||
n = str(number).replace(',', '.')
|
||||
if '.' in n:
|
||||
left, right = n.split('.')
|
||||
return u'%s %s %s' % (
|
||||
self._int2word(int(left)),
|
||||
self.pointword,
|
||||
self._int2word(int(right))
|
||||
)
|
||||
else:
|
||||
return self._int2word(int(n))
|
||||
|
||||
def pluralize(self, n, forms):
|
||||
if n % 100 < 10 or n % 100 > 20:
|
||||
if n % 10 == 1:
|
||||
form = 0
|
||||
elif 5 > n % 10 > 1:
|
||||
form = 1
|
||||
else:
|
||||
form = 2
|
||||
else:
|
||||
form = 2
|
||||
return forms[form]
|
||||
|
||||
def to_ordinal(self, number):
|
||||
self.verify_ordinal(number)
|
||||
outwords = self.to_cardinal(number).split(" ")
|
||||
lastword = outwords[-1].lower()
|
||||
try:
|
||||
if len(outwords) > 1:
|
||||
if outwords[-2] in self.ords_feminine:
|
||||
outwords[-2] = self.ords_feminine.get(
|
||||
outwords[-2], outwords[-2])
|
||||
elif outwords[-2] == 'десять':
|
||||
outwords[-2] = outwords[-2][:-1] + 'и'
|
||||
if len(outwords) == 3:
|
||||
if outwords[-3] in ['один', 'одна']:
|
||||
outwords[-3] = ''
|
||||
lastword = self.ords[lastword]
|
||||
except KeyError:
|
||||
if lastword[:-3] in self.ords_feminine:
|
||||
lastword = self.ords_feminine.get(
|
||||
lastword[:-3], lastword) + "сотый"
|
||||
elif lastword[-1] == "ь" or lastword[-2] == "т":
|
||||
lastword = lastword[:-1] + "ый"
|
||||
elif lastword[-1] == "к":
|
||||
lastword = lastword + "овой"
|
||||
elif lastword[-5:] == "десят":
|
||||
lastword = lastword.replace('ь', 'и') + 'ый'
|
||||
elif lastword[-2] == "ч" or lastword[-1] == "ч":
|
||||
if lastword[-2] == "ч":
|
||||
lastword = lastword[:-1] + "ный"
|
||||
if lastword[-1] == "ч":
|
||||
lastword = lastword + "ный"
|
||||
elif lastword[-1] == "н" or lastword[-2] == "н":
|
||||
lastword = lastword[:lastword.rfind('н') + 1] + "ный"
|
||||
elif lastword[-1] == "д" or lastword[-2] == "д":
|
||||
lastword = lastword[:lastword.rfind('д') + 1] + "ный"
|
||||
outwords[-1] = self.title(lastword)
|
||||
return " ".join(outwords).strip()
|
||||
|
||||
def _cents_verbose(self, number, currency):
|
||||
return self._int2word(number, currency == 'RUB')
|
||||
|
||||
def _int2word(self, n, feminine=False):
|
||||
if n < 0:
|
||||
return ' '.join([self.negword, self._int2word(abs(n))])
|
||||
|
||||
if n == 0:
|
||||
return ZERO[0]
|
||||
|
||||
words = []
|
||||
chunks = list(splitbyx(str(n), 3))
|
||||
i = len(chunks)
|
||||
for x in chunks:
|
||||
i -= 1
|
||||
|
||||
if x == 0:
|
||||
continue
|
||||
|
||||
n1, n2, n3 = get_digits(x)
|
||||
|
||||
if n3 > 0:
|
||||
words.append(HUNDREDS[n3][0])
|
||||
|
||||
if n2 > 1:
|
||||
words.append(TWENTIES[n2][0])
|
||||
|
||||
if n2 == 1:
|
||||
words.append(TENS[n1][0])
|
||||
elif n1 > 0:
|
||||
ones = ONES_FEMININE if i == 1 or feminine and i == 0 else ONES
|
||||
words.append(ones[n1][0])
|
||||
|
||||
if i > 0:
|
||||
words.append(self.pluralize(x, THOUSANDS[i]))
|
||||
|
||||
return ' '.join(words)
|
||||
|
||||
@@ -16,8 +16,6 @@
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
# MA 02110-1301 USA
|
||||
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from .lang_EU import Num2Word_EU
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2003, Taro Ogawa. 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
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
# MA 02110-1301 USA
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from .base import Num2Word_Base
|
||||
|
||||
@@ -1,184 +1,183 @@
|
||||
# -*- 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 num2words.base import Num2Word_Base
|
||||
from num2words.currency import parse_currency_parts
|
||||
from num2words.utils import splitbyx
|
||||
|
||||
|
||||
class Num2Word_TH(Num2Word_Base):
|
||||
|
||||
def setup(self):
|
||||
self.negword = 'ติดลบ'
|
||||
self.pointword = 'จุด'
|
||||
|
||||
self.CURRENCY_FORMS = {
|
||||
'THB': (('บาท', 'บาท'), ('สตางค์', 'สตางค์')),
|
||||
'USD': (('ดอลลาร์', 'ดอลลาร์'), ('เซนต์', 'เซนต์')),
|
||||
'EUR': (('ยูโร', 'ยูโร'), ('เซนต์', 'เซนต์')),
|
||||
}
|
||||
|
||||
self.high_numwords = []
|
||||
|
||||
self.mid_numwords = ['', 'สิบ', 'ร้อย', 'พัน', 'หมื่น', 'แสน', 'ล้าน']
|
||||
|
||||
self.low_numwords = [
|
||||
'ศูนย์', 'หนึ่ง', 'สอง', 'สาม', 'สี่',
|
||||
'ห้า', 'หก', 'เจ็ด', 'แปด', 'เก้า'
|
||||
]
|
||||
|
||||
def set_high_numwords(self, high_numwords):
|
||||
pass
|
||||
|
||||
def set_mid_numwords(self, mid_numwords):
|
||||
pass
|
||||
|
||||
def splitnum(self, six_num):
|
||||
length = len(six_num) > 1
|
||||
word_num = ''
|
||||
|
||||
for index, num in enumerate(map(int, six_num)):
|
||||
if num:
|
||||
if index:
|
||||
word_num = self.mid_numwords[index] + word_num
|
||||
|
||||
if length and num == 1 and index == 0:
|
||||
word_num += 'เอ็ด'
|
||||
elif index == 1 and num == 2:
|
||||
word_num = 'ยี่' + word_num
|
||||
elif index != 1 or num != 1:
|
||||
word_num = self.low_numwords[num] + word_num
|
||||
|
||||
elif num == 0 and index == 0 and length == 0:
|
||||
word_num = self.low_numwords[0]
|
||||
|
||||
return word_num
|
||||
|
||||
def split_six(self, num_txt):
|
||||
result = splitbyx(num_txt, 6, format_int=False)
|
||||
result = list(result)[::-1]
|
||||
number_list = []
|
||||
for i in result:
|
||||
number_list.append(i[::-1])
|
||||
return number_list
|
||||
|
||||
def add_text_million(self, word_num):
|
||||
result = ''
|
||||
|
||||
for index, t in enumerate(reversed(word_num)):
|
||||
if index == 0:
|
||||
result = t
|
||||
else:
|
||||
result = result + 'ล้าน' + t
|
||||
|
||||
return result
|
||||
|
||||
def round_2_decimal(self, number):
|
||||
integer, cents, negative = parse_currency_parts(
|
||||
number, is_int_with_cents=False
|
||||
)
|
||||
integer = '{}'.format(integer)
|
||||
cents = '{}'.format(cents)
|
||||
|
||||
if len(cents) < 2:
|
||||
add_zero = 2 - len(cents)
|
||||
cents = ('0' * add_zero) + cents
|
||||
|
||||
text_num = integer + '.' + cents
|
||||
|
||||
return text_num, negative
|
||||
|
||||
def left_num_to_text(self, number):
|
||||
|
||||
left_num_list = self.split_six(number)
|
||||
|
||||
left_text_list = []
|
||||
for i in left_num_list:
|
||||
left_text_list.append(self.splitnum(i))
|
||||
|
||||
left_text = self.add_text_million(left_text_list)
|
||||
return left_text
|
||||
|
||||
def to_cardinal(self, number):
|
||||
negative = number < 0
|
||||
|
||||
pre, post = self.float2tuple(number)
|
||||
precision = self.precision
|
||||
pre = '{}'.format(pre)
|
||||
post = '{}'.format(post)
|
||||
|
||||
if negative:
|
||||
pre = pre.lstrip('-')
|
||||
|
||||
if len(post) < precision:
|
||||
add_zero = precision - len(post)
|
||||
post = ('0' * add_zero) + post
|
||||
|
||||
result = self.left_num_to_text(pre)
|
||||
|
||||
right_text = ''
|
||||
if not post == '0':
|
||||
for i in map(int, post):
|
||||
right_text = right_text + self.low_numwords[i]
|
||||
result = result + 'จุด' + right_text
|
||||
|
||||
if negative:
|
||||
result = 'ติดลบ' + result
|
||||
|
||||
return result
|
||||
|
||||
def to_ordinal(self, number):
|
||||
return self.to_cardinal(number)
|
||||
|
||||
def to_currency(self, number, currency='THB'):
|
||||
|
||||
number, negative = self.round_2_decimal(number)
|
||||
|
||||
split_num = number.split('.')
|
||||
|
||||
left_num = split_num[0]
|
||||
left_text = self.left_num_to_text(left_num)
|
||||
|
||||
right_num = split_num[1]
|
||||
right_text = self.splitnum(right_num[::-1].rstrip('0'))
|
||||
|
||||
try:
|
||||
cr1, cr2 = self.CURRENCY_FORMS[currency]
|
||||
|
||||
except KeyError:
|
||||
raise NotImplementedError(
|
||||
'Currency code "%s" not implemented for "%s"' %
|
||||
(currency, self.__class__.__name__))
|
||||
|
||||
if right_num == '00':
|
||||
if currency == 'THB':
|
||||
result = left_text + cr1[0] + 'ถ้วน'
|
||||
else:
|
||||
result = left_text + cr1[0]
|
||||
else:
|
||||
if left_num == '0':
|
||||
result = right_text + cr2[0]
|
||||
else:
|
||||
result = left_text + cr1[0] + right_text + cr2[0]
|
||||
|
||||
if negative:
|
||||
result = self.negword + result
|
||||
|
||||
return result
|
||||
# -*- 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 num2words.base import Num2Word_Base
|
||||
from num2words.currency import parse_currency_parts
|
||||
from num2words.utils import splitbyx
|
||||
|
||||
|
||||
class Num2Word_TH(Num2Word_Base):
|
||||
|
||||
def setup(self):
|
||||
self.negword = 'ติดลบ'
|
||||
self.pointword = 'จุด'
|
||||
|
||||
self.CURRENCY_FORMS = {
|
||||
'THB': (('บาท', 'บาท'), ('สตางค์', 'สตางค์')),
|
||||
'USD': (('ดอลลาร์', 'ดอลลาร์'), ('เซนต์', 'เซนต์')),
|
||||
'EUR': (('ยูโร', 'ยูโร'), ('เซนต์', 'เซนต์')),
|
||||
}
|
||||
|
||||
self.high_numwords = []
|
||||
|
||||
self.mid_numwords = ['', 'สิบ', 'ร้อย', 'พัน', 'หมื่น', 'แสน', 'ล้าน']
|
||||
|
||||
self.low_numwords = [
|
||||
'ศูนย์', 'หนึ่ง', 'สอง', 'สาม', 'สี่',
|
||||
'ห้า', 'หก', 'เจ็ด', 'แปด', 'เก้า'
|
||||
]
|
||||
|
||||
def set_high_numwords(self, high_numwords):
|
||||
pass
|
||||
|
||||
def set_mid_numwords(self, mid_numwords):
|
||||
pass
|
||||
|
||||
def splitnum(self, six_num):
|
||||
length = len(six_num) > 1
|
||||
word_num = ''
|
||||
|
||||
for index, num in enumerate(map(int, six_num)):
|
||||
if num:
|
||||
if index:
|
||||
word_num = self.mid_numwords[index] + word_num
|
||||
|
||||
if length and num == 1 and index == 0:
|
||||
word_num += 'เอ็ด'
|
||||
elif index == 1 and num == 2:
|
||||
word_num = 'ยี่' + word_num
|
||||
elif index != 1 or num != 1:
|
||||
word_num = self.low_numwords[num] + word_num
|
||||
|
||||
elif num == 0 and index == 0 and length == 0:
|
||||
word_num = self.low_numwords[0]
|
||||
|
||||
return word_num
|
||||
|
||||
def split_six(self, num_txt):
|
||||
result = splitbyx(num_txt, 6, format_int=False)
|
||||
result = list(result)[::-1]
|
||||
number_list = []
|
||||
for i in result:
|
||||
number_list.append(i[::-1])
|
||||
return number_list
|
||||
|
||||
def add_text_million(self, word_num):
|
||||
result = ''
|
||||
|
||||
for index, t in enumerate(reversed(word_num)):
|
||||
if index == 0:
|
||||
result = t
|
||||
else:
|
||||
result = result + 'ล้าน' + t
|
||||
|
||||
return result
|
||||
|
||||
def round_2_decimal(self, number):
|
||||
integer, cents, negative = parse_currency_parts(
|
||||
number, is_int_with_cents=False
|
||||
)
|
||||
integer = '{}'.format(integer)
|
||||
cents = '{}'.format(cents)
|
||||
|
||||
if len(cents) < 2:
|
||||
add_zero = 2 - len(cents)
|
||||
cents = ('0' * add_zero) + cents
|
||||
|
||||
text_num = integer + '.' + cents
|
||||
|
||||
return text_num, negative
|
||||
|
||||
def left_num_to_text(self, number):
|
||||
|
||||
left_num_list = self.split_six(number)
|
||||
|
||||
left_text_list = []
|
||||
for i in left_num_list:
|
||||
left_text_list.append(self.splitnum(i))
|
||||
|
||||
left_text = self.add_text_million(left_text_list)
|
||||
return left_text
|
||||
|
||||
def to_cardinal(self, number):
|
||||
negative = number < 0
|
||||
|
||||
pre, post = self.float2tuple(number)
|
||||
precision = self.precision
|
||||
pre = '{}'.format(pre)
|
||||
post = '{}'.format(post)
|
||||
|
||||
if negative:
|
||||
pre = pre.lstrip('-')
|
||||
|
||||
if len(post) < precision:
|
||||
add_zero = precision - len(post)
|
||||
post = ('0' * add_zero) + post
|
||||
|
||||
result = self.left_num_to_text(pre)
|
||||
|
||||
right_text = ''
|
||||
if not post == '0':
|
||||
for i in map(int, post):
|
||||
right_text = right_text + self.low_numwords[i]
|
||||
result = result + 'จุด' + right_text
|
||||
|
||||
if negative:
|
||||
result = 'ติดลบ' + result
|
||||
|
||||
return result
|
||||
|
||||
def to_ordinal(self, number):
|
||||
return self.to_cardinal(number)
|
||||
|
||||
def to_currency(self, number, currency='THB'):
|
||||
|
||||
number, negative = self.round_2_decimal(number)
|
||||
|
||||
split_num = number.split('.')
|
||||
|
||||
left_num = split_num[0]
|
||||
left_text = self.left_num_to_text(left_num)
|
||||
|
||||
right_num = split_num[1]
|
||||
right_text = self.splitnum(right_num[::-1].rstrip('0'))
|
||||
|
||||
try:
|
||||
cr1, cr2 = self.CURRENCY_FORMS[currency]
|
||||
|
||||
except KeyError:
|
||||
raise NotImplementedError(
|
||||
'Currency code "%s" not implemented for "%s"' %
|
||||
(currency, self.__class__.__name__))
|
||||
|
||||
if right_num == '00':
|
||||
if currency == 'THB':
|
||||
result = left_text + cr1[0] + 'ถ้วน'
|
||||
else:
|
||||
result = left_text + cr1[0]
|
||||
else:
|
||||
if left_num == '0':
|
||||
result = right_text + cr2[0]
|
||||
else:
|
||||
result = left_text + cr1[0] + right_text + cr2[0]
|
||||
|
||||
if negative:
|
||||
result = self.negword + result
|
||||
|
||||
return result
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# -*- 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) 2017, Tufan Kaynak, Framras. All Rights Reserved.
|
||||
|
||||
@@ -1,174 +1,179 @@
|
||||
# -*- encoding: 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 .base import Num2Word_Base
|
||||
from .utils import get_digits, splitbyx
|
||||
|
||||
ZERO = ('нуль',)
|
||||
|
||||
ONES_FEMININE = {
|
||||
1: ('одна',),
|
||||
2: ('двi',),
|
||||
3: ('три',),
|
||||
4: ('чотири',),
|
||||
5: ('п\'ять',),
|
||||
6: ('шiсть',),
|
||||
7: ('сiм',),
|
||||
8: ('вiсiм',),
|
||||
9: ('дев\'ять',),
|
||||
}
|
||||
|
||||
ONES = {
|
||||
1: ('один',),
|
||||
2: ('два',),
|
||||
3: ('три',),
|
||||
4: ('чотири',),
|
||||
5: ('п\'ять',),
|
||||
6: ('шiсть',),
|
||||
7: ('сiм',),
|
||||
8: ('вiсiм',),
|
||||
9: ('дев\'ять',),
|
||||
}
|
||||
|
||||
TENS = {
|
||||
0: ('десять',),
|
||||
1: ('одинадцять',),
|
||||
2: ('дванадцять',),
|
||||
3: ('тринадцять',),
|
||||
4: ('чотирнадцять',),
|
||||
5: ('п\'ятнадцять',),
|
||||
6: ('шiстнадцять',),
|
||||
7: ('сiмнадцять',),
|
||||
8: ('вiсiмнадцять',),
|
||||
9: ('дев\'ятнадцять',),
|
||||
}
|
||||
|
||||
TWENTIES = {
|
||||
2: ('двадцять',),
|
||||
3: ('тридцять',),
|
||||
4: ('сорок',),
|
||||
5: ('п\'ятдесят',),
|
||||
6: ('шiстдесят',),
|
||||
7: ('сiмдесят',),
|
||||
8: ('вiсiмдесят',),
|
||||
9: ('дев\'яносто',),
|
||||
}
|
||||
|
||||
HUNDREDS = {
|
||||
1: ('сто',),
|
||||
2: ('двiстi',),
|
||||
3: ('триста',),
|
||||
4: ('чотириста',),
|
||||
5: ('п\'ятсот',),
|
||||
6: ('шiстсот',),
|
||||
7: ('сiмсот',),
|
||||
8: ('вiсiмсот',),
|
||||
9: ('дев\'ятсот',),
|
||||
}
|
||||
|
||||
THOUSANDS = {
|
||||
1: ('тисяча', 'тисячi', 'тисяч'), # 10^3
|
||||
2: ('мiльйон', 'мiльйони', 'мiльйонiв'), # 10^6
|
||||
3: ('мiльярд', 'мiльярди', 'мiльярдiв'), # 10^9
|
||||
4: ('трильйон', 'трильйони', 'трильйонiв'), # 10^12
|
||||
5: ('квадрильйон', 'квадрильйони', 'квадрильйонiв'), # 10^15
|
||||
6: ('квiнтильйон', 'квiнтильйони', 'квiнтильйонiв'), # 10^18
|
||||
7: ('секстильйон', 'секстильйони', 'секстильйонiв'), # 10^21
|
||||
8: ('септильйон', 'септильйони', 'септильйонiв'), # 10^24
|
||||
9: ('октильйон', 'октильйони', 'октильйонiв'), # 10^27
|
||||
10: ('нонiльйон', 'нонiльйони', 'нонiльйонiв'), # 10^30
|
||||
}
|
||||
|
||||
|
||||
class Num2Word_UK(Num2Word_Base):
|
||||
CURRENCY_FORMS = {
|
||||
'UAH': (
|
||||
('гривня', 'гривнi', 'гривень'),
|
||||
('копiйка', 'копiйки', 'копiйок')
|
||||
),
|
||||
'EUR': (
|
||||
('євро', 'євро', 'євро'), ('цент', 'центи', 'центiв')
|
||||
),
|
||||
}
|
||||
|
||||
def setup(self):
|
||||
self.negword = "мiнус"
|
||||
self.pointword = "кома"
|
||||
|
||||
def to_cardinal(self, number):
|
||||
n = str(number).replace(',', '.')
|
||||
if '.' in n:
|
||||
left, right = n.split('.')
|
||||
return '%s %s %s' % (
|
||||
self._int2word(int(left)),
|
||||
self.pointword,
|
||||
self._int2word(int(right))
|
||||
)
|
||||
else:
|
||||
return self._int2word(int(n))
|
||||
|
||||
def pluralize(self, n, forms):
|
||||
if n % 100 < 10 or n % 100 > 20:
|
||||
if n % 10 == 1:
|
||||
form = 0
|
||||
elif 5 > n % 10 > 1:
|
||||
form = 1
|
||||
else:
|
||||
form = 2
|
||||
else:
|
||||
form = 2
|
||||
|
||||
return forms[form]
|
||||
|
||||
def _int2word(self, n, feminine=True):
|
||||
if n < 0:
|
||||
return ' '.join([self.negword, self._int2word(abs(n))])
|
||||
|
||||
if n == 0:
|
||||
return ZERO[0]
|
||||
|
||||
words = []
|
||||
chunks = list(splitbyx(str(n), 3))
|
||||
i = len(chunks)
|
||||
for x in chunks:
|
||||
i -= 1
|
||||
n1, n2, n3 = get_digits(x)
|
||||
|
||||
if n3 > 0:
|
||||
words.append(HUNDREDS[n3][0])
|
||||
|
||||
if n2 > 1:
|
||||
words.append(TWENTIES[n2][0])
|
||||
|
||||
if n2 == 1:
|
||||
words.append(TENS[n1][0])
|
||||
# elif n1 > 0 and not (i > 0 and x == 1):
|
||||
elif n1 > 0:
|
||||
ones = ONES_FEMININE if i == 1 or feminine and i == 0 else ONES
|
||||
words.append(ones[n1][0])
|
||||
|
||||
if i > 0 and ((n1 + n2 + n3) > 0):
|
||||
words.append(self.pluralize(x, THOUSANDS[i]))
|
||||
|
||||
return ' '.join(words)
|
||||
|
||||
def _cents_verbose(self, number, currency):
|
||||
return self._int2word(number, currency == 'UAH')
|
||||
|
||||
def to_ordinal(self, number):
|
||||
raise NotImplementedError()
|
||||
# -*- 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 .base import Num2Word_Base
|
||||
from .utils import get_digits, splitbyx
|
||||
|
||||
ZERO = ('нуль',)
|
||||
|
||||
ONES_FEMININE = {
|
||||
1: ('одна',),
|
||||
2: ('двi',),
|
||||
3: ('три',),
|
||||
4: ('чотири',),
|
||||
5: ('п\'ять',),
|
||||
6: ('шiсть',),
|
||||
7: ('сiм',),
|
||||
8: ('вiсiм',),
|
||||
9: ('дев\'ять',),
|
||||
}
|
||||
|
||||
ONES = {
|
||||
1: ('один',),
|
||||
2: ('два',),
|
||||
3: ('три',),
|
||||
4: ('чотири',),
|
||||
5: ('п\'ять',),
|
||||
6: ('шiсть',),
|
||||
7: ('сiм',),
|
||||
8: ('вiсiм',),
|
||||
9: ('дев\'ять',),
|
||||
}
|
||||
|
||||
TENS = {
|
||||
0: ('десять',),
|
||||
1: ('одинадцять',),
|
||||
2: ('дванадцять',),
|
||||
3: ('тринадцять',),
|
||||
4: ('чотирнадцять',),
|
||||
5: ('п\'ятнадцять',),
|
||||
6: ('шiстнадцять',),
|
||||
7: ('сiмнадцять',),
|
||||
8: ('вiсiмнадцять',),
|
||||
9: ('дев\'ятнадцять',),
|
||||
}
|
||||
|
||||
TWENTIES = {
|
||||
2: ('двадцять',),
|
||||
3: ('тридцять',),
|
||||
4: ('сорок',),
|
||||
5: ('п\'ятдесят',),
|
||||
6: ('шiстдесят',),
|
||||
7: ('сiмдесят',),
|
||||
8: ('вiсiмдесят',),
|
||||
9: ('дев\'яносто',),
|
||||
}
|
||||
|
||||
HUNDREDS = {
|
||||
1: ('сто',),
|
||||
2: ('двiстi',),
|
||||
3: ('триста',),
|
||||
4: ('чотириста',),
|
||||
5: ('п\'ятсот',),
|
||||
6: ('шiстсот',),
|
||||
7: ('сiмсот',),
|
||||
8: ('вiсiмсот',),
|
||||
9: ('дев\'ятсот',),
|
||||
}
|
||||
|
||||
THOUSANDS = {
|
||||
1: ('тисяча', 'тисячi', 'тисяч'), # 10^3
|
||||
2: ('мiльйон', 'мiльйони', 'мiльйонiв'), # 10^6
|
||||
3: ('мiльярд', 'мiльярди', 'мiльярдiв'), # 10^9
|
||||
4: ('трильйон', 'трильйони', 'трильйонiв'), # 10^12
|
||||
5: ('квадрильйон', 'квадрильйони', 'квадрильйонiв'), # 10^15
|
||||
6: ('квiнтильйон', 'квiнтильйони', 'квiнтильйонiв'), # 10^18
|
||||
7: ('секстильйон', 'секстильйони', 'секстильйонiв'), # 10^21
|
||||
8: ('септильйон', 'септильйони', 'септильйонiв'), # 10^24
|
||||
9: ('октильйон', 'октильйони', 'октильйонiв'), # 10^27
|
||||
10: ('нонiльйон', 'нонiльйони', 'нонiльйонiв'), # 10^30
|
||||
}
|
||||
|
||||
|
||||
class Num2Word_UK(Num2Word_Base):
|
||||
CURRENCY_FORMS = {
|
||||
'UAH': (
|
||||
('гривня', 'гривнi', 'гривень'),
|
||||
('копiйка', 'копiйки', 'копiйок')
|
||||
),
|
||||
'EUR': (
|
||||
('євро', 'євро', 'євро'), ('цент', 'центи', 'центiв')
|
||||
),
|
||||
}
|
||||
|
||||
def setup(self):
|
||||
self.negword = "мiнус"
|
||||
self.pointword = "кома"
|
||||
|
||||
def to_cardinal(self, number):
|
||||
n = str(number).replace(',', '.')
|
||||
if '.' in n:
|
||||
left, right = n.split('.')
|
||||
return '%s %s %s' % (
|
||||
self._int2word(int(left)),
|
||||
self.pointword,
|
||||
self._int2word(int(right))
|
||||
)
|
||||
else:
|
||||
return self._int2word(int(n))
|
||||
|
||||
def pluralize(self, n, forms):
|
||||
if n % 100 < 10 or n % 100 > 20:
|
||||
if n % 10 == 1:
|
||||
form = 0
|
||||
elif 5 > n % 10 > 1:
|
||||
form = 1
|
||||
else:
|
||||
form = 2
|
||||
else:
|
||||
form = 2
|
||||
|
||||
return forms[form]
|
||||
|
||||
def _int2word(self, n, feminine=True):
|
||||
if n < 0:
|
||||
return ' '.join([self.negword, self._int2word(abs(n))])
|
||||
|
||||
if n == 0:
|
||||
return ZERO[0]
|
||||
|
||||
words = []
|
||||
chunks = list(splitbyx(str(n), 3))
|
||||
i = len(chunks)
|
||||
for x in chunks:
|
||||
i -= 1
|
||||
|
||||
if x == 0:
|
||||
continue
|
||||
|
||||
n1, n2, n3 = get_digits(x)
|
||||
|
||||
if n3 > 0:
|
||||
words.append(HUNDREDS[n3][0])
|
||||
|
||||
if n2 > 1:
|
||||
words.append(TWENTIES[n2][0])
|
||||
|
||||
if n2 == 1:
|
||||
words.append(TENS[n1][0])
|
||||
# elif n1 > 0 and not (i > 0 and x == 1):
|
||||
elif n1 > 0:
|
||||
ones = ONES_FEMININE if i == 1 or feminine and i == 0 else ONES
|
||||
words.append(ones[n1][0])
|
||||
|
||||
if i > 0:
|
||||
words.append(self.pluralize(x, THOUSANDS[i]))
|
||||
|
||||
return ' '.join(words)
|
||||
|
||||
def _cents_verbose(self, number, currency):
|
||||
return self._int2word(number, currency == 'UAH')
|
||||
|
||||
def to_ordinal(self, number):
|
||||
raise NotImplementedError()
|
||||
|
||||
@@ -1,17 +1,35 @@
|
||||
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
|
||||
# -*- 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
|
||||
|
||||
|
||||
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
|
||||
|
||||
24
setup.py
24
setup.py
@@ -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
|
||||
from io import open
|
||||
|
||||
from setuptools import find_packages, setup
|
||||
|
||||
@@ -17,8 +35,8 @@ CLASSIFIERS = [
|
||||
'Topic :: Text Processing :: Linguistic',
|
||||
]
|
||||
|
||||
LONG_DESC = open('README.rst', 'rt').read() + '\n\n' + \
|
||||
open('CHANGES.rst', 'rt').read()
|
||||
LONG_DESC = open('README.rst', 'rt', encoding="utf-8").read() + '\n\n' + \
|
||||
open('CHANGES.rst', 'rt', encoding="utf-8").read()
|
||||
|
||||
|
||||
def find_version(fname):
|
||||
@@ -26,7 +44,7 @@ def find_version(fname):
|
||||
Returns str or raises RuntimeError
|
||||
"""
|
||||
version = ''
|
||||
with open(fname, 'r') as fp:
|
||||
with open(fname, 'r', encoding="utf-8") as fp:
|
||||
reg = re.compile(r'__version__ = [\'"]([^\'"]*)[\'"]')
|
||||
for line in fp:
|
||||
m = reg.match(line)
|
||||
|
||||
@@ -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.
|
||||
|
||||
# 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
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
# MA 02110-1301 USA
|
||||
# from __future__ import unicode_literals
|
||||
|
||||
from unittest import TestCase
|
||||
|
||||
|
||||
@@ -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 decimal import Decimal
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- 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
|
||||
|
||||
|
||||
@@ -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 unittest import TestCase
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved.
|
||||
# -*- 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
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved.
|
||||
# -*- 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
|
||||
|
||||
@@ -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.
|
||||
|
||||
# This library is free software; you can redistribute it and/or
|
||||
|
||||
@@ -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.
|
||||
|
||||
# This library is free software; you can redistribute it and/or
|
||||
|
||||
@@ -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.
|
||||
|
||||
# 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
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
# MA 02110-1301 USA
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from unittest import TestCase
|
||||
|
||||
@@ -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.
|
||||
|
||||
# This library is free software; you can redistribute it and/or
|
||||
|
||||
@@ -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.
|
||||
|
||||
# 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
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
# MA 02110-1301 USA
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from num2words import num2words
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
# -*- 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
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copetright (c) 2015, Savoir-faire Linux inc. All Rights Reserved.
|
||||
# -*- coding: utf-8 -*-
|
||||
# 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
|
||||
# modifet it under the terms of the GNU Lesser General Public
|
||||
# License as published bet the Free Software Foundation; either
|
||||
# version 2.1 of the License, or (at etour option) anet later version.
|
||||
# This libraret is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warrantet of
|
||||
# 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 copet of the GNU Lesser General Public
|
||||
# License along with this libraret; if not, write to the Free Software
|
||||
# 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 unittest import TestCase
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved.
|
||||
# -*- 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
|
||||
@@ -13,7 +14,6 @@
|
||||
# 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 unittest import TestCase
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved.
|
||||
# -*- 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
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved.
|
||||
# -*- 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
|
||||
|
||||
@@ -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.
|
||||
|
||||
# This library is free software; you can redistribute it and/or
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved.
|
||||
# -*- 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
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
# -*- 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
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
# -*- 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
|
||||
|
||||
@@ -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 unittest import TestCase
|
||||
@@ -53,9 +69,6 @@ class Num2WordsLTTest(TestCase):
|
||||
'minus penki tūkstančiai kablelis dvidešimt du',
|
||||
)
|
||||
|
||||
# print(fill(n2w(1000000000000000000000000000000)))
|
||||
# naintilijonas
|
||||
|
||||
def test_to_ordinal(self):
|
||||
# @TODO: implement to_ordinal
|
||||
with self.assertRaises(NotImplementedError):
|
||||
|
||||
@@ -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 unittest import TestCase
|
||||
@@ -48,9 +64,6 @@ class Num2WordsLVTest(TestCase):
|
||||
'mīnus pieci tūkstoši komats divdesmit divi',
|
||||
)
|
||||
|
||||
# >>> print(fill(n2w(1000000000000000000000000000000)))
|
||||
# nontiljons
|
||||
|
||||
self.assertEqual(num2words(0, lang='lv'), 'nulle')
|
||||
self.assertEqual(num2words(5, lang='lv'), "pieci")
|
||||
self.assertEqual(num2words(15, lang='lv'), "piecpadsmit")
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved.
|
||||
# -*- 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
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved.
|
||||
# -*- 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
|
||||
@@ -45,6 +46,10 @@ class Num2WordsPLTest(TestCase):
|
||||
"miliard dwieście trzydzieści cztery miliony pięćset "
|
||||
"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(
|
||||
num2words(215461407892039002157189883901676, lang='pl'),
|
||||
"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 "
|
||||
"dwa biliardy sto pięćdziesiąt siedem bilionów sto osiemdziesiąt "
|
||||
"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(
|
||||
num2words(719094234693663034822824384220291, lang='pl'),
|
||||
@@ -66,19 +71,15 @@ class Num2WordsPLTest(TestCase):
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(
|
||||
963301000001918264129471042047146102350812074235000101020000120324,
|
||||
963301000001918264129471001047146102 * 10**30 + 1007,
|
||||
lang='pl'
|
||||
),
|
||||
"dziewięćset sześćdziesiąt trzy decyliardy trzysta jeden "
|
||||
"decylionów nonylion dziewięćset osiemnaście oktyliardów dwieście "
|
||||
"sześćdziesiąt cztery oktyliony sto dwadzieścia dziewięć "
|
||||
"septyliardów czterysta siedemdziesiąt jeden septylionów "
|
||||
"czterdzieści dwa sekstyliardy czterdzieści siedem sekstylionów "
|
||||
"sto czterdzieści sześć kwintyliardów sto dwa kwintyliony trzysta "
|
||||
"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"
|
||||
"sekstyliard czterdzieści siedem sekstylionów sto czterdzieści "
|
||||
"sześć kwintyliardów sto dwa kwintyliony tysiąc siedem"
|
||||
)
|
||||
|
||||
def test_to_ordinal(self):
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved.
|
||||
# -*- 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
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved.
|
||||
# -*- 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
|
||||
|
||||
@@ -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.
|
||||
|
||||
# This library is free software; you can redistribute it and/or
|
||||
|
||||
@@ -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.
|
||||
|
||||
# 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
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
# MA 02110-1301 USA
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from unittest import TestCase
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved.
|
||||
# -*- 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
|
||||
|
||||
@@ -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.
|
||||
|
||||
# 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
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
# MA 02110-1301 USA
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from unittest import TestCase
|
||||
|
||||
401
tests/test_th.py
401
tests/test_th.py
@@ -1,193 +1,208 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from unittest import TestCase
|
||||
|
||||
from num2words import num2words
|
||||
from num2words.lang_TH import Num2Word_TH
|
||||
|
||||
|
||||
class TestNumWord(TestCase):
|
||||
|
||||
def test_0(self):
|
||||
self.assertEqual(num2words(0, lang='th'), "ศูนย์")
|
||||
|
||||
def test_end_with_1(self):
|
||||
self.assertEqual(num2words(21, lang='th'), "ยี่สิบเอ็ด")
|
||||
self.assertEqual(num2words(11, lang='th'), "สิบเอ็ด")
|
||||
self.assertEqual(num2words(101, lang='th'), "หนึ่งร้อยเอ็ด")
|
||||
self.assertEqual(num2words(1201, lang='th'), "หนึ่งพันสองร้อยเอ็ด")
|
||||
|
||||
def test_start_20(self):
|
||||
self.assertEqual(num2words(22, lang='th'), "ยี่สิบสอง")
|
||||
self.assertEqual(num2words(27, lang='th'), "ยี่สิบเจ็ด")
|
||||
|
||||
def test_start_10(self):
|
||||
self.assertEqual(num2words(10, lang='th'), "สิบ")
|
||||
self.assertEqual(num2words(18, lang='th'), "สิบแปด")
|
||||
|
||||
def test_1_to_9(self):
|
||||
self.assertEqual(num2words(1, lang='th'), "หนึ่ง")
|
||||
self.assertEqual(num2words(5, lang='th'), "ห้า")
|
||||
self.assertEqual(num2words(9, lang='th'), "เก้า")
|
||||
|
||||
def test_31_to_99(self):
|
||||
self.assertEqual(num2words(31, lang='th'), "สามสิบเอ็ด")
|
||||
self.assertEqual(num2words(48, lang='th'), "สี่สิบแปด")
|
||||
self.assertEqual(num2words(76, lang='th'), "เจ็ดสิบหก")
|
||||
|
||||
def test_100_to_999(self):
|
||||
self.assertEqual(num2words(100, lang='th'), "หนึ่งร้อย")
|
||||
self.assertEqual(num2words(123, lang='th'), "หนึ่งร้อยยี่สิบสาม")
|
||||
self.assertEqual(num2words(456, lang='th'), "สี่ร้อยห้าสิบหก")
|
||||
self.assertEqual(num2words(721, lang='th'), "เจ็ดร้อยยี่สิบเอ็ด")
|
||||
|
||||
def test_1000_to_9999(self):
|
||||
self.assertEqual(num2words(1000, lang='th'), "หนึ่งพัน")
|
||||
self.assertEqual(
|
||||
num2words(2175, lang='th'), "สองพันหนึ่งร้อยเจ็ดสิบห้า"
|
||||
)
|
||||
self.assertEqual(num2words(4582, lang='th'), "สี่พันห้าร้อยแปดสิบสอง")
|
||||
self.assertEqual(num2words(9346, lang='th'), "เก้าพันสามร้อยสี่สิบหก")
|
||||
|
||||
def test_10000_to_99999(self):
|
||||
self.assertEqual(
|
||||
num2words(11111, lang='th'), "หนึ่งหมื่นหนึ่งพันหนึ่งร้อยสิบเอ็ด"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(22222, lang='th'), "สองหมื่นสองพันสองร้อยยี่สิบสอง"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(84573, lang='th'), "แปดหมื่นสี่พันห้าร้อยเจ็ดสิบสาม"
|
||||
)
|
||||
|
||||
def test_100000_to_999999(self):
|
||||
self.assertEqual(
|
||||
num2words(153247, lang='th'),
|
||||
"หนึ่งแสนห้าหมื่นสามพันสองร้อยสี่สิบเจ็ด"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(562442, lang='th'),
|
||||
"ห้าแสนหกหมื่นสองพันสี่ร้อยสี่สิบสอง"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(999999, lang='th'),
|
||||
"เก้าแสนเก้าหมื่นเก้าพันเก้าร้อยเก้าสิบเก้า"
|
||||
)
|
||||
|
||||
def test_more_than_million(self):
|
||||
self.assertEqual(
|
||||
num2words(1000000, lang='th'),
|
||||
"หนึ่งล้าน"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(1000001, lang='th'),
|
||||
"หนึ่งล้านเอ็ด"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(42478941, lang='th'),
|
||||
"สี่สิบสองล้านสี่แสนเจ็ดหมื่นแปดพันเก้าร้อยสี่สิบเอ็ด"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(712696969, lang='th'),
|
||||
"เจ็ดร้อยสิบสองล้านหกแสนเก้าหมื่นหกพันเก้าร้อยหกสิบเก้า"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(1000000000000000001, lang='th'),
|
||||
"หนึ่งล้านล้านล้านเอ็ด"
|
||||
)
|
||||
|
||||
def test_decimal(self):
|
||||
self.assertEqual(
|
||||
num2words(0.0, lang='th'), "ศูนย์"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(0.0038, lang='th'), "ศูนย์จุดศูนย์ศูนย์สามแปด"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(0.01, lang='th'), "ศูนย์จุดศูนย์หนึ่ง"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(1.123, lang='th'), "หนึ่งจุดหนึ่งสองสาม"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(35.37, lang='th'), "สามสิบห้าจุดสามเจ็ด"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(1000000.01, lang='th'), "หนึ่งล้านจุดศูนย์หนึ่ง"
|
||||
)
|
||||
|
||||
def test_currency(self):
|
||||
self.assertEqual(
|
||||
num2words(100, lang='th', to='currency', currency='THB'),
|
||||
"หนึ่งร้อยบาทถ้วน"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(100, lang='th', to='currency', currency='USD'),
|
||||
"หนึ่งร้อยดอลลาร์"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(100, lang='th', to='currency', currency='EUR'),
|
||||
"หนึ่งร้อยยูโร"
|
||||
)
|
||||
|
||||
def test_currency_decimal(self):
|
||||
self.assertEqual(
|
||||
num2words(0.00, lang='th', to='currency'), "ศูนย์บาทถ้วน"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(0.05, lang='th', to='currency'), "ห้าสตางค์"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(0.50, lang='th', to='currency'), "ห้าสิบสตางค์"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(0.99, lang='th', to='currency'), "เก้าสิบเก้าสตางค์"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(100.00, lang='th', to='currency'), "หนึ่งร้อยบาทถ้วน"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(100.23, lang='th', to='currency', currency='USD'),
|
||||
"หนึ่งร้อยดอลลาร์ยี่สิบสามเซนต์"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(100.24, lang='th', to='currency', currency='EUR'),
|
||||
"หนึ่งร้อยยูโรยี่สิบสี่เซนต์"
|
||||
)
|
||||
|
||||
def test_negative(self):
|
||||
self.assertEqual(num2words(-10, lang='th'), "ติดลบสิบ")
|
||||
self.assertEqual(num2words(-10.50, lang='th'), "ติดลบสิบจุดห้า")
|
||||
self.assertEqual(
|
||||
num2words(-100.00, lang='th', to='currency'),
|
||||
"ติดลบหนึ่งร้อยบาทถ้วน"
|
||||
)
|
||||
|
||||
def test_round_2_decimal(self):
|
||||
n2wTH = Num2Word_TH()
|
||||
self.assertEqual(n2wTH.round_2_decimal(0.004), ('0.00', False))
|
||||
self.assertEqual(n2wTH.round_2_decimal(0.005), ('0.01', False))
|
||||
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))
|
||||
self.assertEqual(n2wTH.round_2_decimal(0.989), ('0.99', False))
|
||||
self.assertEqual(n2wTH.round_2_decimal(0.994), ('0.99', False))
|
||||
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'])
|
||||
# -*- 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 unittest import TestCase
|
||||
|
||||
from num2words import num2words
|
||||
from num2words.lang_TH import Num2Word_TH
|
||||
|
||||
|
||||
class TestNumWord(TestCase):
|
||||
|
||||
def test_0(self):
|
||||
self.assertEqual(num2words(0, lang='th'), "ศูนย์")
|
||||
|
||||
def test_end_with_1(self):
|
||||
self.assertEqual(num2words(21, lang='th'), "ยี่สิบเอ็ด")
|
||||
self.assertEqual(num2words(11, lang='th'), "สิบเอ็ด")
|
||||
self.assertEqual(num2words(101, lang='th'), "หนึ่งร้อยเอ็ด")
|
||||
self.assertEqual(num2words(1201, lang='th'), "หนึ่งพันสองร้อยเอ็ด")
|
||||
|
||||
def test_start_20(self):
|
||||
self.assertEqual(num2words(22, lang='th'), "ยี่สิบสอง")
|
||||
self.assertEqual(num2words(27, lang='th'), "ยี่สิบเจ็ด")
|
||||
|
||||
def test_start_10(self):
|
||||
self.assertEqual(num2words(10, lang='th'), "สิบ")
|
||||
self.assertEqual(num2words(18, lang='th'), "สิบแปด")
|
||||
|
||||
def test_1_to_9(self):
|
||||
self.assertEqual(num2words(1, lang='th'), "หนึ่ง")
|
||||
self.assertEqual(num2words(5, lang='th'), "ห้า")
|
||||
self.assertEqual(num2words(9, lang='th'), "เก้า")
|
||||
|
||||
def test_31_to_99(self):
|
||||
self.assertEqual(num2words(31, lang='th'), "สามสิบเอ็ด")
|
||||
self.assertEqual(num2words(48, lang='th'), "สี่สิบแปด")
|
||||
self.assertEqual(num2words(76, lang='th'), "เจ็ดสิบหก")
|
||||
|
||||
def test_100_to_999(self):
|
||||
self.assertEqual(num2words(100, lang='th'), "หนึ่งร้อย")
|
||||
self.assertEqual(num2words(123, lang='th'), "หนึ่งร้อยยี่สิบสาม")
|
||||
self.assertEqual(num2words(456, lang='th'), "สี่ร้อยห้าสิบหก")
|
||||
self.assertEqual(num2words(721, lang='th'), "เจ็ดร้อยยี่สิบเอ็ด")
|
||||
|
||||
def test_1000_to_9999(self):
|
||||
self.assertEqual(num2words(1000, lang='th'), "หนึ่งพัน")
|
||||
self.assertEqual(
|
||||
num2words(2175, lang='th'), "สองพันหนึ่งร้อยเจ็ดสิบห้า"
|
||||
)
|
||||
self.assertEqual(num2words(4582, lang='th'), "สี่พันห้าร้อยแปดสิบสอง")
|
||||
self.assertEqual(num2words(9346, lang='th'), "เก้าพันสามร้อยสี่สิบหก")
|
||||
|
||||
def test_10000_to_99999(self):
|
||||
self.assertEqual(
|
||||
num2words(11111, lang='th'), "หนึ่งหมื่นหนึ่งพันหนึ่งร้อยสิบเอ็ด"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(22222, lang='th'), "สองหมื่นสองพันสองร้อยยี่สิบสอง"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(84573, lang='th'), "แปดหมื่นสี่พันห้าร้อยเจ็ดสิบสาม"
|
||||
)
|
||||
|
||||
def test_100000_to_999999(self):
|
||||
self.assertEqual(
|
||||
num2words(153247, lang='th'),
|
||||
"หนึ่งแสนห้าหมื่นสามพันสองร้อยสี่สิบเจ็ด"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(562442, lang='th'),
|
||||
"ห้าแสนหกหมื่นสองพันสี่ร้อยสี่สิบสอง"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(999999, lang='th'),
|
||||
"เก้าแสนเก้าหมื่นเก้าพันเก้าร้อยเก้าสิบเก้า"
|
||||
)
|
||||
|
||||
def test_more_than_million(self):
|
||||
self.assertEqual(
|
||||
num2words(1000000, lang='th'),
|
||||
"หนึ่งล้าน"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(1000001, lang='th'),
|
||||
"หนึ่งล้านเอ็ด"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(42478941, lang='th'),
|
||||
"สี่สิบสองล้านสี่แสนเจ็ดหมื่นแปดพันเก้าร้อยสี่สิบเอ็ด"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(712696969, lang='th'),
|
||||
"เจ็ดร้อยสิบสองล้านหกแสนเก้าหมื่นหกพันเก้าร้อยหกสิบเก้า"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(1000000000000000001, lang='th'),
|
||||
"หนึ่งล้านล้านล้านเอ็ด"
|
||||
)
|
||||
|
||||
def test_decimal(self):
|
||||
self.assertEqual(
|
||||
num2words(0.0, lang='th'), "ศูนย์"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(0.0038, lang='th'), "ศูนย์จุดศูนย์ศูนย์สามแปด"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(0.01, lang='th'), "ศูนย์จุดศูนย์หนึ่ง"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(1.123, lang='th'), "หนึ่งจุดหนึ่งสองสาม"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(35.37, lang='th'), "สามสิบห้าจุดสามเจ็ด"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(1000000.01, lang='th'), "หนึ่งล้านจุดศูนย์หนึ่ง"
|
||||
)
|
||||
|
||||
def test_currency(self):
|
||||
self.assertEqual(
|
||||
num2words(100, lang='th', to='currency', currency='THB'),
|
||||
"หนึ่งร้อยบาทถ้วน"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(100, lang='th', to='currency', currency='USD'),
|
||||
"หนึ่งร้อยดอลลาร์"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(100, lang='th', to='currency', currency='EUR'),
|
||||
"หนึ่งร้อยยูโร"
|
||||
)
|
||||
|
||||
def test_currency_decimal(self):
|
||||
self.assertEqual(
|
||||
num2words(0.00, lang='th', to='currency'), "ศูนย์บาทถ้วน"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(0.05, lang='th', to='currency'), "ห้าสตางค์"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(0.50, lang='th', to='currency'), "ห้าสิบสตางค์"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(0.99, lang='th', to='currency'), "เก้าสิบเก้าสตางค์"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(100.00, lang='th', to='currency'), "หนึ่งร้อยบาทถ้วน"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(100.23, lang='th', to='currency', currency='USD'),
|
||||
"หนึ่งร้อยดอลลาร์ยี่สิบสามเซนต์"
|
||||
)
|
||||
self.assertEqual(
|
||||
num2words(100.24, lang='th', to='currency', currency='EUR'),
|
||||
"หนึ่งร้อยยูโรยี่สิบสี่เซนต์"
|
||||
)
|
||||
|
||||
def test_negative(self):
|
||||
self.assertEqual(num2words(-10, lang='th'), "ติดลบสิบ")
|
||||
self.assertEqual(num2words(-10.50, lang='th'), "ติดลบสิบจุดห้า")
|
||||
self.assertEqual(
|
||||
num2words(-100.00, lang='th', to='currency'),
|
||||
"ติดลบหนึ่งร้อยบาทถ้วน"
|
||||
)
|
||||
|
||||
def test_round_2_decimal(self):
|
||||
n2wTH = Num2Word_TH()
|
||||
self.assertEqual(n2wTH.round_2_decimal(0.004), ('0.00', False))
|
||||
self.assertEqual(n2wTH.round_2_decimal(0.005), ('0.01', False))
|
||||
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))
|
||||
self.assertEqual(n2wTH.round_2_decimal(0.989), ('0.99', False))
|
||||
self.assertEqual(n2wTH.round_2_decimal(0.994), ('0.99', False))
|
||||
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'])
|
||||
|
||||
@@ -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) 2017, Tufan Kaynak, Framras. 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
|
||||
|
||||
@@ -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.
|
||||
|
||||
# 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
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
# MA 02110-1301 USA
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from unittest import TestCase
|
||||
|
||||
@@ -1,24 +1,41 @@
|
||||
from unittest import TestCase
|
||||
|
||||
from num2words.utils import splitbyx
|
||||
|
||||
|
||||
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']
|
||||
)
|
||||
# -*- 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 unittest import TestCase
|
||||
|
||||
from num2words.utils import splitbyx
|
||||
|
||||
|
||||
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']
|
||||
)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015, Savoir-faire Linux inc. All Rights Reserved.
|
||||
# -*- 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
|
||||
|
||||
Reference in New Issue
Block a user