Skip to content

Commit 72f1f88

Browse files
gonsaletmrodriguezg1991
authored andcommitted
lang_ES: improved currency gender handling, improved error messages; test_es: updated accordingly
1 parent bd699be commit 72f1f88

File tree

2 files changed

+124
-83
lines changed

2 files changed

+124
-83
lines changed

num2words/lang_ES.py

Lines changed: 55 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@
2727
'SKK', 'GBP', 'CYP', 'EGP', 'FKP', 'GIP',
2828
'LBP', 'SDG', 'SHP', 'SSP', 'SYP', 'INR',
2929
'IDR', 'LKR', 'MUR', 'NPR', 'PKR', 'SCR',
30-
'ESP')
30+
'ESP', 'TRY', 'ITL')
31+
CENTS_UNA = ('EGP', 'JOD', 'LBP', 'SDG', 'SSP', 'SYP')
3132

3233

3334
class Num2Word_ES(Num2Word_EU):
@@ -216,9 +217,13 @@ def setup(self):
216217
self.high_numwords = self.gen_high_numwords([], [], lows)
217218
self.negword = "menos "
218219
self.pointword = "punto"
219-
self.errmsg_nonnum = "Solo números pueden ser convertidos a palabras."
220+
self.errmsg_nonnum = "type(%s) no es [long, int, float]"
221+
self.errmsg_floatord = "El float %s no puede ser tratado como un" \
222+
" ordinal."
223+
self.errmsg_negord = "El número negativo %s no puede ser tratado" \
224+
" como un ordinal."
220225
self.errmsg_toobig = (
221-
"Numero muy grande para ser convertido a palabras."
226+
"abs(%s) deber ser inferior a %s."
222227
)
223228
self.gender_stem = "o"
224229
self.exclude_title = ["y", "menos", "punto"]
@@ -352,17 +357,52 @@ def to_currency(self, val, currency='EUR', cents=True, separator=' con',
352357
result = super(Num2Word_ES, self).to_currency(
353358
val, currency=currency, cents=cents, separator=separator,
354359
adjective=adjective)
355-
# Handle exception, in spanish is "un euro" and not "uno euro"
356-
# except in this currencies: leona, corona,
357-
# libra, rupia, lempira, peseta, is 'una'
358-
# but only when it's first word, otherwise
359-
# it's replaced in others words like 'veintiun'
360+
# Handle exception: In Spanish it's "un euro" and not "uno euro",
361+
# except in these currencies, where it's "una": leona, corona,
362+
# libra, lira, rupia, lempira, peseta.
363+
# The same goes for "veintiuna", "treinta y una"...
364+
# Also, this needs to be handled separately for "dollars" and
365+
# "cents".
366+
# All "cents" are masculine except for: piastra.
367+
# Source: https://www.rae.es/dpd/una (section 2.2)
368+
369+
# split "dollars" part from "cents" part
370+
list_result = result.split(" con ")
371+
372+
# "DOLLARS" PART (list_result[0])
373+
374+
# Feminine currencies ("una libra", "trescientas libras"...)
360375
if currency in CURRENCIES_UNA:
361-
list_result = result.split(" ")
362-
if list_result[0] == "uno":
363-
list_result[0] = list_result[0].replace("uno", "una")
364-
result = " ".join(list_result)
365-
result = result.replace("uno", "un")
366-
# correct orthography for the specific case of "veintiún":
367-
result = result.replace("veintiun", "veintiún")
376+
377+
# "una libra", "veintiuna libras", "treinta y una libras"...
378+
list_result[0] = list_result[0].replace("uno", "una")
379+
380+
# "doscientas libras", "trescientas libras"...
381+
list_result[0] = list_result[0].replace("cientos", "cientas")
382+
383+
# Masc.: Correct orthography for the specific case of "veintiún":
384+
list_result[0] = list_result[0].replace("veintiuno", "veintiún")
385+
386+
# Masculine currencies: general case ("un euro", "treinta y un
387+
# euros"...):
388+
list_result[0] = list_result[0].replace("uno", "un")
389+
390+
# "CENTS" PART (list_result[1])
391+
392+
# Feminine "cents" ("una piastra", "veintiuna piastras"...)
393+
if currency in CENTS_UNA:
394+
395+
# "una piastra", "veintiuna piastras", "treinta y una piastras"...
396+
list_result[1] = list_result[1].replace("uno", "una")
397+
398+
# Masc.: Correct orthography for the specific case of "veintiún":
399+
list_result[1] = list_result[1].replace("veintiuno", "veintiún")
400+
401+
# Masculine "cents": general case ("un centavo", "treinta y un
402+
# centavos"...):
403+
list_result[1] = list_result[1].replace("uno", "un")
404+
405+
# join back "dollars" part with "cents" part
406+
result = " con ".join(list_result)
407+
368408
return result

tests/test_es.py

Lines changed: 69 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,9 @@
128128
(2.00, 'dos pesetas con cero céntimos'),
129129
(8.00, 'ocho pesetas con cero céntimos'),
130130
(12.00, 'doce pesetas con cero céntimos'),
131-
(21.00, 'veintiún pesetas con cero céntimos'),
132-
(81.25, 'ochenta y un pesetas con veinticinco céntimos'),
133-
(350.90, 'trescientos cincuenta pesetas con noventa céntimos'),
131+
(21.00, 'veintiuna pesetas con cero céntimos'),
132+
(81.25, 'ochenta y una pesetas con veinticinco céntimos'),
133+
(350.90, 'trescientas cincuenta pesetas con noventa céntimos'),
134134
(100.00, 'cien pesetas con cero céntimos'),
135135
)
136136

@@ -175,9 +175,9 @@
175175
(2.00, 'dos libras con cero peniques'),
176176
(8.00, 'ocho libras con cero peniques'),
177177
(12.00, 'doce libras con cero peniques'),
178-
(21.00, 'veintiún libras con cero peniques'),
179-
(81.25, 'ochenta y un libras con veinticinco peniques'),
180-
(350.90, 'trescientos cincuenta libras con noventa peniques'),
178+
(21.00, 'veintiuna libras con cero peniques'),
179+
(81.25, 'ochenta y una libras con veinticinco peniques'),
180+
(350.90, 'trescientas cincuenta libras con noventa peniques'),
181181
(100.00, 'cien libras con cero peniques'),
182182
(4150.83,
183183
'cuatro mil ciento cincuenta libras con ochenta y tres peniques'),
@@ -201,9 +201,9 @@
201201
(2.00, 'dos coronas con cero öre'),
202202
(8.00, 'ocho coronas con cero öre'),
203203
(12.00, 'doce coronas con cero öre'),
204-
(21.00, 'veintiún coronas con cero öre'),
205-
(81.25, 'ochenta y un coronas con veinticinco öre'),
206-
(350.90, 'trescientos cincuenta coronas con noventa öre'),
204+
(21.00, 'veintiuna coronas con cero öre'),
205+
(81.25, 'ochenta y una coronas con veinticinco öre'),
206+
(350.90, 'trescientas cincuenta coronas con noventa öre'),
207207
(100.00, 'cien coronas con cero öre'),
208208
(4150.83,
209209
'cuatro mil ciento cincuenta coronas con ochenta y tres öre'),
@@ -214,9 +214,9 @@
214214
(2.00, 'dos coronas con cero øre'),
215215
(8.00, 'ocho coronas con cero øre'),
216216
(12.00, 'doce coronas con cero øre'),
217-
(21.00, 'veintiún coronas con cero øre'),
218-
(81.25, 'ochenta y un coronas con veinticinco øre'),
219-
(350.90, 'trescientos cincuenta coronas con noventa øre'),
217+
(21.00, 'veintiuna coronas con cero øre'),
218+
(81.25, 'ochenta y una coronas con veinticinco øre'),
219+
(350.90, 'trescientas cincuenta coronas con noventa øre'),
220220
(100.00, 'cien coronas con cero øre'),
221221
(4150.83,
222222
'cuatro mil ciento cincuenta coronas con ochenta y tres øre'),
@@ -266,9 +266,9 @@
266266
(2.00, 'dos rupias con cero paisas'),
267267
(8.00, 'ocho rupias con cero paisas'),
268268
(12.00, 'doce rupias con cero paisas'),
269-
(21.00, 'veintiún rupias con cero paisas'),
270-
(81.25, 'ochenta y un rupias con veinticinco paisas'),
271-
(350.90, 'trescientos cincuenta rupias con noventa paisas'),
269+
(21.00, 'veintiuna rupias con cero paisas'),
270+
(81.25, 'ochenta y una rupias con veinticinco paisas'),
271+
(350.90, 'trescientas cincuenta rupias con noventa paisas'),
272272
(100.00, 'cien rupias con cero paisas'),
273273
(4150.83,
274274
'cuatro mil ciento cincuenta rupias con ochenta y tres paisas'),
@@ -318,9 +318,9 @@
318318
(2.00, 'dos coronas con cero haléř'),
319319
(8.00, 'ocho coronas con cero haléř'),
320320
(12.00, 'doce coronas con cero haléř'),
321-
(21.00, 'veintiún coronas con cero haléř'),
322-
(81.25, 'ochenta y un coronas con veinticinco haléř'),
323-
(350.90, 'trescientos cincuenta coronas con noventa haléř'),
321+
(21.00, 'veintiuna coronas con cero haléř'),
322+
(81.25, 'ochenta y una coronas con veinticinco haléř'),
323+
(350.90, 'trescientas cincuenta coronas con noventa haléř'),
324324
(100.00, 'cien coronas con cero haléř'),
325325
(4150.83,
326326
'cuatro mil ciento cincuenta coronas con ochenta y tres haléř'),
@@ -405,13 +405,13 @@
405405
)
406406

407407
TEST_CASES_TO_CURRENCY_TRY = (
408-
(1.00, 'un lira con cero kuruş'),
408+
(1.00, 'una lira con cero kuruş'),
409409
(2.00, 'dos liras con cero kuruş'),
410410
(8.00, 'ocho liras con cero kuruş'),
411411
(12.00, 'doce liras con cero kuruş'),
412-
(21.00, 'veintiún liras con cero kuruş'),
413-
(81.25, 'ochenta y un liras con veinticinco kuruş'),
414-
(350.90, 'trescientos cincuenta liras con noventa kuruş'),
412+
(21.00, 'veintiuna liras con cero kuruş'),
413+
(81.25, 'ochenta y una liras con veinticinco kuruş'),
414+
(350.90, 'trescientas cincuenta liras con noventa kuruş'),
415415
(100.00, 'cien liras con cero kuruş'),
416416
(4150.83,
417417
'cuatro mil ciento cincuenta liras con ochenta y tres kuruş'),
@@ -708,9 +708,9 @@
708708
(2.00, 'dos libras con cero céntimos'),
709709
(8.00, 'ocho libras con cero céntimos'),
710710
(12.00, 'doce libras con cero céntimos'),
711-
(21.00, 'veintiún libras con cero céntimos'),
712-
(81.25, 'ochenta y un libras con veinticinco céntimos'),
713-
(350.90, 'trescientos cincuenta libras con noventa céntimos'),
711+
(21.00, 'veintiuna libras con cero céntimos'),
712+
(81.25, 'ochenta y una libras con veinticinco céntimos'),
713+
(350.90, 'trescientas cincuenta libras con noventa céntimos'),
714714
(100.00, 'cien libras con cero céntimos'),
715715
(4150.83,
716716
'cuatro mil ciento cincuenta libras con ochenta y tres céntimos'),
@@ -721,9 +721,9 @@
721721
(2.00, 'dos coronas con cero øre'),
722722
(8.00, 'ocho coronas con cero øre'),
723723
(12.00, 'doce coronas con cero øre'),
724-
(21.00, 'veintiún coronas con cero øre'),
725-
(81.25, 'ochenta y un coronas con veinticinco øre'),
726-
(350.90, 'trescientos cincuenta coronas con noventa øre'),
724+
(21.00, 'veintiuna coronas con cero øre'),
725+
(81.25, 'ochenta y una coronas con veinticinco øre'),
726+
(350.90, 'trescientas cincuenta coronas con noventa øre'),
727727
(100.00, 'cien coronas con cero øre'),
728728
(4150.83,
729729
'cuatro mil ciento cincuenta coronas con ochenta y tres øre'),
@@ -760,9 +760,10 @@
760760
(2.00, 'dos libras con cero piastras'),
761761
(8.00, 'ocho libras con cero piastras'),
762762
(12.00, 'doce libras con cero piastras'),
763-
(21.00, 'veintiún libras con cero piastras'),
764-
(81.25, 'ochenta y un libras con veinticinco piastras'),
765-
(350.90, 'trescientos cincuenta libras con noventa piastras'),
763+
(21.00, 'veintiuna libras con cero piastras'),
764+
(81.21, 'ochenta y una libras con veintiuna piastras'),
765+
(81.25, 'ochenta y una libras con veinticinco piastras'),
766+
(350.90, 'trescientas cincuenta libras con noventa piastras'),
766767
(100.00, 'cien libras con cero piastras'),
767768
(4150.83,
768769
'cuatro mil ciento cincuenta libras con ochenta y tres piastras'),
@@ -799,9 +800,9 @@
799800
(2.00, 'dos libras con cero peniques'),
800801
(8.00, 'ocho libras con cero peniques'),
801802
(12.00, 'doce libras con cero peniques'),
802-
(21.00, 'veintiún libras con cero peniques'),
803-
(81.25, 'ochenta y un libras con veinticinco peniques'),
804-
(350.90, 'trescientos cincuenta libras con noventa peniques'),
803+
(21.00, 'veintiuna libras con cero peniques'),
804+
(81.25, 'ochenta y una libras con veinticinco peniques'),
805+
(350.90, 'trescientas cincuenta libras con noventa peniques'),
805806
(100.00, 'cien libras con cero peniques'),
806807
(4150.83,
807808
'cuatro mil ciento cincuenta libras con ochenta y tres peniques'),
@@ -903,9 +904,9 @@
903904
(2.00, 'dos rupias con cero céntimos'),
904905
(8.00, 'ocho rupias con cero céntimos'),
905906
(12.00, 'doce rupias con cero céntimos'),
906-
(21.00, 'veintiún rupias con cero céntimos'),
907-
(81.25, 'ochenta y un rupias con veinticinco céntimos'),
908-
(350.90, 'trescientos cincuenta rupias con noventa céntimos'),
907+
(21.00, 'veintiuna rupias con cero céntimos'),
908+
(81.25, 'ochenta y una rupias con veinticinco céntimos'),
909+
(350.90, 'trescientas cincuenta rupias con noventa céntimos'),
909910
(100.00, 'cien rupias con cero céntimos'),
910911
(4150.83,
911912
'cuatro mil ciento cincuenta rupias con ochenta y tres céntimos'),
@@ -955,22 +956,22 @@
955956
(2.00, 'dos coronas con cero aurar'),
956957
(8.00, 'ocho coronas con cero aurar'),
957958
(12.00, 'doce coronas con cero aurar'),
958-
(21.00, 'veintiún coronas con cero aurar'),
959-
(81.25, 'ochenta y un coronas con veinticinco aurar'),
960-
(350.90, 'trescientos cincuenta coronas con noventa aurar'),
959+
(21.00, 'veintiuna coronas con cero aurar'),
960+
(81.25, 'ochenta y una coronas con veinticinco aurar'),
961+
(350.90, 'trescientas cincuenta coronas con noventa aurar'),
961962
(100.00, 'cien coronas con cero aurar'),
962963
(4150.83,
963964
'cuatro mil ciento cincuenta coronas con ochenta y tres aurar'),
964965
)
965966

966967
TEST_CASES_TO_CURRENCY_ITL = (
967-
(1.00, 'un lira con cero céntimos'),
968+
(1.00, 'una lira con cero céntimos'),
968969
(2.00, 'dos liras con cero céntimos'),
969970
(8.00, 'ocho liras con cero céntimos'),
970971
(12.00, 'doce liras con cero céntimos'),
971-
(21.00, 'veintiún liras con cero céntimos'),
972-
(81.25, 'ochenta y un liras con veinticinco céntimos'),
973-
(350.90, 'trescientos cincuenta liras con noventa céntimos'),
972+
(21.00, 'veintiuna liras con cero céntimos'),
973+
(81.25, 'ochenta y una liras con veinticinco céntimos'),
974+
(350.90, 'trescientas cincuenta liras con noventa céntimos'),
974975
(100.00, 'cien liras con cero céntimos'),
975976
(4150.83,
976977
'cuatro mil ciento cincuenta liras con ochenta y tres céntimos'),
@@ -1059,9 +1060,9 @@
10591060
(2.00, 'dos rupias con cero céntimos'),
10601061
(8.00, 'ocho rupias con cero céntimos'),
10611062
(12.00, 'doce rupias con cero céntimos'),
1062-
(21.00, 'veintiún rupias con cero céntimos'),
1063-
(81.25, 'ochenta y un rupias con veinticinco céntimos'),
1064-
(350.90, 'trescientos cincuenta rupias con noventa céntimos'),
1063+
(21.00, 'veintiuna rupias con cero céntimos'),
1064+
(81.25, 'ochenta y una rupias con veinticinco céntimos'),
1065+
(350.90, 'trescientas cincuenta rupias con noventa céntimos'),
10651066
(100.00, 'cien rupias con cero céntimos'),
10661067
(4150.83,
10671068
'cuatro mil ciento cincuenta rupias con ochenta y tres céntimos'),
@@ -1241,9 +1242,9 @@
12411242
(2.00, 'dos rupias con cero céntimos'),
12421243
(8.00, 'ocho rupias con cero céntimos'),
12431244
(12.00, 'doce rupias con cero céntimos'),
1244-
(21.00, 'veintiún rupias con cero céntimos'),
1245-
(81.25, 'ochenta y un rupias con veinticinco céntimos'),
1246-
(350.90, 'trescientos cincuenta rupias con noventa céntimos'),
1245+
(21.00, 'veintiuna rupias con cero céntimos'),
1246+
(81.25, 'ochenta y una rupias con veinticinco céntimos'),
1247+
(350.90, 'trescientas cincuenta rupias con noventa céntimos'),
12471248
(100.00, 'cien rupias con cero céntimos'),
12481249
(4150.83,
12491250
'cuatro mil ciento cincuenta rupias con ochenta y tres céntimos'),
@@ -1319,9 +1320,9 @@
13191320
(2.00, 'dos rupias con cero paisas'),
13201321
(8.00, 'ocho rupias con cero paisas'),
13211322
(12.00, 'doce rupias con cero paisas'),
1322-
(21.00, 'veintiún rupias con cero paisas'),
1323-
(81.25, 'ochenta y un rupias con veinticinco paisas'),
1324-
(350.90, 'trescientos cincuenta rupias con noventa paisas'),
1323+
(21.00, 'veintiuna rupias con cero paisas'),
1324+
(81.25, 'ochenta y una rupias con veinticinco paisas'),
1325+
(350.90, 'trescientas cincuenta rupias con noventa paisas'),
13251326
(100.00, 'cien rupias con cero paisas'),
13261327
(4150.83,
13271328
'cuatro mil ciento cincuenta rupias con ochenta y tres paisas'),
@@ -1371,9 +1372,9 @@
13711372
(2.00, 'dos rupias con cero paisas'),
13721373
(8.00, 'ocho rupias con cero paisas'),
13731374
(12.00, 'doce rupias con cero paisas'),
1374-
(21.00, 'veintiún rupias con cero paisas'),
1375-
(81.25, 'ochenta y un rupias con veinticinco paisas'),
1376-
(350.90, 'trescientos cincuenta rupias con noventa paisas'),
1375+
(21.00, 'veintiuna rupias con cero paisas'),
1376+
(81.25, 'ochenta y una rupias con veinticinco paisas'),
1377+
(350.90, 'trescientas cincuenta rupias con noventa paisas'),
13771378
(100.00, 'cien rupias con cero paisas'),
13781379
(4150.83,
13791380
'cuatro mil ciento cincuenta rupias con ochenta y tres paisas'),
@@ -1462,9 +1463,9 @@
14621463
(2.00, 'dos rupias con cero céntimos'),
14631464
(8.00, 'ocho rupias con cero céntimos'),
14641465
(12.00, 'doce rupias con cero céntimos'),
1465-
(21.00, 'veintiún rupias con cero céntimos'),
1466-
(81.25, 'ochenta y un rupias con veinticinco céntimos'),
1467-
(350.90, 'trescientos cincuenta rupias con noventa céntimos'),
1466+
(21.00, 'veintiuna rupias con cero céntimos'),
1467+
(81.25, 'ochenta y una rupias con veinticinco céntimos'),
1468+
(350.90, 'trescientas cincuenta rupias con noventa céntimos'),
14681469
(100.00, 'cien rupias con cero céntimos'),
14691470
(4150.83,
14701471
'cuatro mil ciento cincuenta rupias con ochenta y tres céntimos'),
@@ -1475,9 +1476,9 @@
14751476
(2.00, 'dos libras con cero peniques'),
14761477
(8.00, 'ocho libras con cero peniques'),
14771478
(12.00, 'doce libras con cero peniques'),
1478-
(21.00, 'veintiún libras con cero peniques'),
1479-
(81.25, 'ochenta y un libras con veinticinco peniques'),
1480-
(350.90, 'trescientos cincuenta libras con noventa peniques'),
1479+
(21.00, 'veintiuna libras con cero peniques'),
1480+
(81.25, 'ochenta y una libras con veinticinco peniques'),
1481+
(350.90, 'trescientas cincuenta libras con noventa peniques'),
14811482
(100.00, 'cien libras con cero peniques'),
14821483
(4150.83,
14831484
'cuatro mil ciento cincuenta libras con ochenta y tres peniques'),
@@ -1488,9 +1489,9 @@
14881489
(2.00, 'dos coronas con cero haliers'),
14891490
(8.00, 'ocho coronas con cero haliers'),
14901491
(12.00, 'doce coronas con cero haliers'),
1491-
(21.00, 'veintiún coronas con cero haliers'),
1492-
(81.25, 'ochenta y un coronas con veinticinco haliers'),
1493-
(350.90, 'trescientos cincuenta coronas con noventa haliers'),
1492+
(21.00, 'veintiuna coronas con cero haliers'),
1493+
(81.25, 'ochenta y una coronas con veinticinco haliers'),
1494+
(350.90, 'trescientas cincuenta coronas con noventa haliers'),
14941495
(100.00, 'cien coronas con cero haliers'),
14951496
(4150.83,
14961497
'cuatro mil ciento cincuenta coronas con ochenta y tres haliers'),
@@ -1501,9 +1502,9 @@
15011502
(2.00, 'dos leonas con cero céntimos'),
15021503
(8.00, 'ocho leonas con cero céntimos'),
15031504
(12.00, 'doce leonas con cero céntimos'),
1504-
(21.00, 'veintiún leonas con cero céntimos'),
1505-
(81.25, 'ochenta y un leonas con veinticinco céntimos'),
1506-
(350.90, 'trescientos cincuenta leonas con noventa céntimos'),
1505+
(21.00, 'veintiuna leonas con cero céntimos'),
1506+
(81.25, 'ochenta y una leonas con veinticinco céntimos'),
1507+
(350.90, 'trescientas cincuenta leonas con noventa céntimos'),
15071508
(100.00, 'cien leonas con cero céntimos'),
15081509
(4150.83,
15091510
'cuatro mil ciento cincuenta leonas con ochenta y tres céntimos'),

0 commit comments

Comments
 (0)