diff --git a/num2words/__init__.py b/num2words/__init__.py index 57c4d57..3884ebb 100644 --- a/num2words/__init__.py +++ b/num2words/__init__.py @@ -33,6 +33,8 @@ from . import lang_DK from . import lang_PT_BR from . import lang_HE from . import lang_IT +from . import lang_ES_VE +from . import lang_ES_CO CONVERTER_CLASSES = { 'en': lang_EN.Num2Word_EN(), @@ -42,6 +44,8 @@ CONVERTER_CLASSES = { 'fr_CH': lang_FR_CH.Num2Word_FR_CH(), 'de': lang_DE.Num2Word_DE(), 'es': lang_ES.Num2Word_ES(), + 'es_CO': lang_ES_CO.Num2Word_ES_CO, + 'es_VE': lang_ES_VE.Num2Word_ES_VE, 'id': lang_ID.Num2Word_ID(), 'lt': lang_LT.Num2Word_LT(), 'lv': lang_LV.Num2Word_LV(), diff --git a/num2words/lang_ES.py b/num2words/lang_ES.py index c010d52..e28e896 100644 --- a/num2words/lang_ES.py +++ b/num2words/lang_ES.py @@ -1,4 +1,4 @@ -#encoding: UTF-8 +# encoding: UTF-8 # Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. @@ -19,16 +19,16 @@ from __future__ import unicode_literals, print_function from .lang_EU import Num2Word_EU + class Num2Word_ES(Num2Word_EU): - #//CHECK: Is this sufficient?? + # //CHECK: Is this sufficient?? def set_high_numwords(self, high): max = 3 + 6*len(high) for word, n in zip(high, range(max, 3, -6)): self.cards[10**(n-3)] = word + "illón" - def setup(self): lows = ["cuatr", "tr", "b", "m"] self.high_numwords = self.gen_high_numwords([], [], lows) @@ -81,7 +81,6 @@ class Num2Word_ES(Num2Word_EU): 1e12 : "trillonésim", 1e15 : "cuadrillonésim" } - def merge(self, curr, next): ctext, cnum, ntext, nnum = curr + next @@ -113,7 +112,6 @@ class Num2Word_ES(Num2Word_EU): return (ctext + ntext, cnum * nnum) - def to_ordinal(self, value): self.verify_ordinal(value) text = "" @@ -151,7 +149,6 @@ class Num2Word_ES(Num2Word_EU): self.verify_ordinal(value) return "%s%s" % (value, "º" if self.gender_stem == 'o' else "ª") - def to_currency(self, val, longval=True, old=False): if old: return self.to_splitnum(val, hightxt="peso/s", lowtxt="peseta/s", diff --git a/num2words/lang_ES_CO.py b/num2words/lang_ES_CO.py new file mode 100644 index 0000000..0f306b6 --- /dev/null +++ b/num2words/lang_ES_CO.py @@ -0,0 +1,50 @@ +# 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, print_function +from .lang_ES import Num2Word_ES + + +class Num2Word_ES_CO(Num2Word_ES): + + def to_currency(self, val, longval=True, old=False): + return self.to_splitnum(val, hightxt="peso/s", lowtxt="peso/s", + divisor=1000, jointxt="y", longval=longval) + + +n2w = Num2Word_ES_CO() +to_card = n2w.to_cardinal +to_ord = n2w.to_ordinal +to_ordnum = n2w.to_ordinal_num + + +def main(): + for val in [1, 11, 12, 21, 31, 33, 71, 80, 81, 91, 99, 100, 101, 102, 155, + 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, + 8280, 8291, 150000, 500000, 1000000, 2000000, 2000001, + -21212121211221211111, -2.121212, -1.0000100]: + n2w.test(val) + + n2w.test(1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) + print(n2w.to_currency(1222)) + print(n2w.to_currency(1222, old=True)) + print(n2w.to_year(1222)) + + +if __name__ == "__main__": + main() diff --git a/num2words/lang_ES_VE.py b/num2words/lang_ES_VE.py new file mode 100644 index 0000000..974daf3 --- /dev/null +++ b/num2words/lang_ES_VE.py @@ -0,0 +1,49 @@ +# 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, print_function +from .lang_ES import Num2Word_ES + + +class Num2Word_ES_VE(Num2Word_ES): + + def to_currency(self, val, longval=True, old=False): + return self.to_splitnum(val, hightxt="bolívar/es Fuerte/s", lowtxt="bolívar/es fuerte/s", + divisor=1000, jointxt="y", longval=longval) + +n2w = Num2Word_ES_VE() +to_card = n2w.to_cardinal +to_ord = n2w.to_ordinal +to_ordnum = n2w.to_ordinal_num + + +def main(): + for val in [1, 11, 12, 21, 31, 33, 71, 80, 81, 91, 99, 100, 101, 102, 155, + 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, + 8280, 8291, 150000, 500000, 1000000, 2000000, 2000001, + -21212121211221211111, -2.121212, -1.0000100]: + n2w.test(val) + + n2w.test(1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) + print(n2w.to_currency(1222)) + print(n2w.to_currency(1222, old=True)) + print(n2w.to_year(1222)) + + +if __name__ == "__main__": + main() diff --git a/tests/test_es.py b/tests/test_es.py new file mode 100644 index 0000000..0a2e59b --- /dev/null +++ b/tests/test_es.py @@ -0,0 +1,95 @@ +# encoding: UTF-8 +# 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 + + +class Num2WordsESTest(TestCase): + + def test_number(self): + + test_cases = ( + (1, 'uno'), + (2, 'dos'), + (3, 'tres'), + (11, 'once'), + (12, 'doce'), + (16, 'dieciseis'), + (19, 'diecinueve'), + (20, 'veinte'), + (21, 'veintiuno'), + (26, 'veintiséis'), + (28, 'vientiocho'), + (30, 'treinta'), + (31, 'treinta y uno'), + (40, 'treinta y dos'), + (43, 'treinta y tres'), + (50, 'cincuenta'), + (55, 'cincuenta y cinco'), + (60, 'secenta'), + (67, 'secenta y siete'), + (70, 'setenta'), + (79, 'setenta y nueve'), + (100, 'cien'), + (101, 'ciento uno'), + (199, 'ciento noventa y nueve'), + (203, 'docientos tres'), + (287, 'docientos ochenta y siete'), + (300, 'trecientos'), + (356, 'trecientos cincuenta y seis'), + (410, 'cuatrocientos'), + (434, 'cuatrocientos treinta y cuatro'), + (578, 'quinientos setenta y ocho'), + (689, 'seiciento ochenta y nueve'), + (729, 'setencientos veintinueve'), + (894, 'ochocientos noventa y cuatro'), + (999, 'novecientos noventa y nueve'), + (1000, 'mil'), + (1001, 'mil uno'), + (1097, 'mil noventa y siete'), + (1104, 'mil ciento cuatro'), + (1243, 'mil docientos cuarenta y tres'), + (2385, 'dos mil trecientos ochenta y cinco'), + (3766, 'tresmil setencientos sesenta y seis'), + (4196, 'cuatromil ciento noventa y seis'), + (5846, 'cinco mil ochocientos cuarenta y seis'), + (6459, 'seis mil cuatrocientos cincuenta y nueve'), + (7232, 'siete mil docientos treinta y dos'), + (8569, 'ocho mil quinientos sesenta y nueve'), + (9539, 'nueve mil quinientos treinta y nueve'), + (1000000, 'un millón'), + (1000001, 'un millón uno'), + ) + + for test in test_cases: + self.assertEqual(num2words(test[0], lang='es'), test[1]) + + def test_ordinal(self): + + test_cases = ( + (1, 'primero'), + (8, 'octavo'), + (12, 'décimosegundo'), + (14, 'décimo cuarto'), + (28, 'vigésimo octavo'), + (100, 'centésimo'), + ) + + for test in test_cases: + self.assertEqual(num2words(test[0], lang='es', ordinal=True), test[1]) diff --git a/tests/test_es_co.py b/tests/test_es_co.py new file mode 100644 index 0000000..85c6349 --- /dev/null +++ b/tests/test_es_co.py @@ -0,0 +1,96 @@ +# encoding: UTF-8 +# 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 + + +class Num2WordsESCOTest(TestCase): + + def test_number(self): + + test_cases = ( + (1, 'uno'), + (2, 'dos'), + (3, 'tres'), + (11, 'once'), + (12, 'doce'), + (16, 'dieciseis'), + (19, 'diecinueve'), + (20, 'veinte'), + (21, 'veintiuno'), + (26, 'veintiséis'), + (28, 'vientiocho'), + (30, 'treinta'), + (31, 'treinta y uno'), + (40, 'treinta y dos'), + (43, 'treinta y tres'), + (50, 'cincuenta'), + (55, 'cincuenta y cinco'), + (60, 'secenta'), + (67, 'secenta y siete'), + (70, 'setenta'), + (79, 'setenta y nueve'), + (100, 'cien'), + (101, 'ciento uno'), + (199, 'ciento noventa y nueve'), + (203, 'docientos tres'), + (287, 'docientos ochenta y siete'), + (300, 'trecientos'), + (356, 'trecientos cincuenta y seis'), + (410, 'cuatrocientos'), + (434, 'cuatrocientos treinta y cuatro'), + (578, 'quinientos setenta y ocho'), + (689, 'seiciento ochenta y nueve'), + (729, 'setencientos veintinueve'), + (894, 'ochocientos noventa y cuatro'), + (999, 'novecientos noventa y nueve'), + (1000, 'mil'), + (1001, 'mil uno'), + (1097, 'mil noventa y siete'), + (1104, 'mil ciento cuatro'), + (1243, 'mil docientos cuarenta y tres'), + (2385, 'dos mil trecientos ochenta y cinco'), + (3766, 'tresmil setencientos sesenta y seis'), + (4196, 'cuatromil ciento noventa y seis'), + (5846, 'cinco mil ochocientos cuarenta y seis'), + (6459, 'seis mil cuatrocientos cincuenta y nueve'), + (7232, 'siete mil docientos treinta y dos'), + (8569, 'ocho mil quinientos sesenta y nueve'), + (9539, 'nueve mil quinientos treinta y nueve'), + (1000000, 'un millón'), + (1000001, 'un millón uno'), + ) + + for test in test_cases: + self.assertEqual(num2words(test[0], lang='es_CO'), test[1]) + + def test_ordinal(self): + + test_cases = ( + (1, 'primero'), + (8, 'octavo'), + (12, 'décimo segundo'), + (14, 'décimo cuarto'), + (28, 'vigésimo octavo'), + (100, 'centésimo'), + ) + + for test in test_cases: + self.assertEqual(num2words(test[0], lang='es_CO', ordinal=True), test[1]) diff --git a/tests/test_es_ve.py b/tests/test_es_ve.py new file mode 100644 index 0000000..1a4db01 --- /dev/null +++ b/tests/test_es_ve.py @@ -0,0 +1,97 @@ +# encoding: UTF-8 +# 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 + + +class Num2WordsESVETest(TestCase): + + def test_number(self): + + test_cases = ( + (1, 'uno'), + (2, 'dos'), + (3, 'tres'), + (11, 'once'), + (12, 'doce'), + (16, 'dieciseis'), + (19, 'diecinueve'), + (20, 'veinte'), + (21, 'veintiuno'), + (26, 'veintiséis'), + (28, 'vientiocho'), + (30, 'treinta'), + (31, 'treinta y uno'), + (40, 'treinta y dos'), + (43, 'treinta y tres'), + (50, 'cincuenta'), + (55, 'cincuenta y cinco'), + (60, 'secenta'), + (67, 'secenta y siete'), + (70, 'setenta'), + (79, 'setenta y nueve'), + (100, 'cien'), + (101, 'ciento uno'), + (199, 'ciento noventa y nueve'), + (203, 'docientos tres'), + (287, 'docientos ochenta y siete'), + (300, 'trecientos'), + (356, 'trecientos cincuenta y seis'), + (410, 'cuatrocientos'), + (434, 'cuatrocientos treinta y cuatro'), + (578, 'quinientos setenta y ocho'), + (689, 'seiciento ochenta y nueve'), + (729, 'setencientos veintinueve'), + (894, 'ochocientos noventa y cuatro'), + (999, 'novecientos noventa y nueve'), + (1000, 'mil'), + (1001, 'mil uno'), + (1097, 'mil noventa y siete'), + (1104, 'mil ciento cuatro'), + (1243, 'mil docientos cuarenta y tres'), + (2385, 'dos mil trecientos ochenta y cinco'), + (3766, 'tresmil setencientos sesenta y seis'), + (4196, 'cuatromil ciento noventa y seis'), + (5846, 'cinco mil ochocientos cuarenta y seis'), + (6459, 'seis mil cuatrocientos cincuenta y nueve'), + (7232, 'siete mil docientos treinta y dos'), + (8569, 'ocho mil quinientos sesenta y nueve'), + (9539, 'nueve mil quinientos treinta y nueve'), + (1000000, 'un millón'), + (1000001, 'un millón uno'), + ) + + for test in test_cases: + self.assertEqual(num2words(test[0], lang='es_VE'), test[1]) + + def test_ordinal(self): + + test_cases = ( + (1, 'primero'), + (8, 'octavo'), + (12, 'décimo segundo'), + (14, 'décimo cuarto'), + (28, 'vigésimo octavo'), + (100, 'centésimo'), + ) + + for test in test_cases: + self.assertEqual(num2words(test[0], lang='es_VE', ordinal=True), test[1]) +