diff --git a/num2words/lang_ES.py b/num2words/lang_ES.py index c2ce131..71103a8 100644 --- a/num2words/lang_ES.py +++ b/num2words/lang_ES.py @@ -1,3 +1,5 @@ +#encoding: UTF-8 + # Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. @@ -17,9 +19,6 @@ from __future__ import unicode_literals from .lang_EU import Num2Word_EU -#//TODO: correct orthographics -#//TODO: error messages - class Num2Word_ES(Num2Word_EU): #//CHECK: Is this sufficient?? @@ -27,7 +26,7 @@ class Num2Word_ES(Num2Word_EU): max = 3 + 6*len(high) for word, n in zip(high, range(max, 3, -6)): - self.cards[10**(n-3)] = word + "ill\xf2n" + self.cards[10**(n-3)] = word + "illón" def setup(self): @@ -35,30 +34,52 @@ class Num2Word_ES(Num2Word_EU): self.high_numwords = self.gen_high_numwords([], [], lows) self.negword = "menos " self.pointword = "punto" - self.errmsg_nonnum = "Only numbers may be converted to words." - self.errmsg_toobig = "Number is too large to convert to words." + self.errmsg_nonnum = "Solo números pueden ser convertidos a palabras." + self.errmsg_toobig = "Numero muy grande para ser convertido a palabras." self.gender_stem = "o" self.exclude_title = ["y", "menos", "punto"] self.mid_numwords = [(1000, "mil"), (100, "cien"), (90, "noventa"), (80, "ochenta"), (70, "setenta"), (60, "sesenta"), - (50,"cincuenta"), (40,"cuarenta"), (30,"treinta")] - self.low_numwords = ["vientinueve", "vientiocho", "vientisiete", - "vientis\xE8is", "vienticinco", "vienticuatro", - "vientitr\xE8s", "vientid\xF2s", "vientiuno", - "viente", "diecinueve", "dieciocho", "diecisiete", + (50, "cincuenta"), (40, "cuarenta"), (30, "treinta")] + self.low_numwords = ["veintinueve", "veintiocho", "veintisiete", + "veintiséis", "veinticinco", "veinticuatro", + "veintitrés", "veintidós", "veintiuno", + "veinte", "diecinueve", "dieciocho", "diecisiete", "dieciseis", "quince", "catorce", "trece", "doce", "once", "diez", "nueve", "ocho", "siete", "seis", "cinco", "cuatro", "tres", "dos", "uno", "cero"] - self.ords = { 1 : "primer", - 2 : "segund", - 3 : "tercer", - 4 : "cuart", - 5 : "quint", - 6 : "sext", - 7 : "s\xE8ptim", - 8 : "octav", - 9 : "noven", - 10 : "d\xE8cim" } + self.ords = { 1 : "primer", + 2 : "segund", + 3 : "tercer", + 4 : "cuart", + 5 : "quint", + 6 : "sext", + 7 : "séptim", + 8 : "octav", + 9 : "noven", + 10 : "décim", + 20 : "vigésim", + 30 : "trigésim", + 40 : "quadragésim", + 50 : "quincuagésim", + 60 : "sexagésim", + 70 : "septuagésim", + 80 : "octogésim", + 90 : "nonagésim", + 100 : "centésim", + 200 : "ducentésim", + 300 : "tricentésim", + 400 : "cuadrigentésim", + 500 : "quingentésim", + 600 : "sexcentésim", + 700 : "septigentésim", + 800 : "octigentésim", + 900 : "noningentésim", + 1e3 : "milésim", + 1e6 : "millonésim", + 1e9 : "billonésim", + 1e12 : "trillonésim", + 1e15 : "cuadrillonésim" } def merge(self, curr, next): @@ -95,15 +116,40 @@ class Num2Word_ES(Num2Word_EU): def to_ordinal(self, value): self.verify_ordinal(value) + text = "" try: - return self.ords[value] + self.gender_stem + if value == 0: + text = "" + elif value <= 10: + text = "%s%s" % (self.ords[value], self.gender_stem) + elif value <= 12: + text = "%s%s%s" % (self.ords[10], self.gender_stem, self.to_ordinal(value - 10)) + elif value <= 100: + dec = (value / 10) * 10 + text = "%s%s %s" % (self.ords[dec], self.gender_stem, self.to_ordinal(value - dec)) + elif value <= 1e3: + cen = (value / 100) * 100 + text = "%s%s %s" % (self.ords[cen], self.gender_stem, self.to_ordinal(value - cen)) + elif value < 1e18: + # dec contains the following: + # [ 1e3, 1e6): 1e3 + # [ 1e6, 1e9): 1e6 + # [ 1e9, 1e12): 1e9 + # [1e12, 1e15): 1e12 + # [1e15, 1e18): 1e15 + dec = 10 ** ((((len(str(int(value))) - 1) / 3 - 1) + 1) * 3) + part = int(float(value / dec) * dec) + cardinal = self.to_cardinal(part / dec) if part / dec != 1 else "" + text = "%s%s%s %s" % (cardinal, self.ords[dec], self.gender_stem, self.to_ordinal(value - part)) + else: + text = self.to_cardinal(value) except KeyError: - return self.to_cardinal(value) + text = self.to_cardinal(value) + return text.strip() def to_ordinal_num(self, value): self.verify_ordinal(value) - # Correct for fem? - return "%s\xB0"%value + return "%s%s" % (value, "º" if self.gender_stem == 'o' else "ª") def to_currency(self, val, longval=True, old=False):