Files
num2words/num2words/lang_ES.py
2021-01-25 21:48:53 -05:00

367 lines
18 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- 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, print_function, unicode_literals
import math
from .lang_EU import Num2Word_EU
GENERIC_DOLLARS = ('dolar', 'dólares')
GENERIC_CENTS = ('centavo', 'centavos')
CURRENCIES_UNA = ('SLL', 'SEK', 'NOK', 'CZK', 'DKK', 'ISK',
'SKK', 'GBP', 'CYP', 'EGP', 'FKP', 'GIP',
'LBP', 'SDG', 'SHP', 'SSP', 'SYP', 'INR',
'IDR', 'LKR', 'MUR', 'NPR', 'PKR', 'SCR',
'ESP')
class Num2Word_ES(Num2Word_EU):
CURRENCY_FORMS = {
'EUR': (('euro', 'euros'), ('céntimo', 'céntimos')),
'ESP': (('peseta', 'pesetas'), ('céntimo', 'céntimos')),
'USD': (GENERIC_DOLLARS, GENERIC_CENTS),
'PEN': (('sol', 'soles'), ('céntimo', 'céntimos')),
'CRC': (('colón', 'colones'), GENERIC_CENTS),
'AUD': (GENERIC_DOLLARS, GENERIC_CENTS),
'CAD': (GENERIC_DOLLARS, GENERIC_CENTS),
'GBP': (('libra', 'libras'), ('penny', 'pence')),
'RUB': (('rublo', 'rublos'), ('kopeyka', 'kopeykas')),
'SEK': (('corona', 'coronas'), ('öre', 'öre')),
'NOK': (('corona', 'coronas'), ('øre', 'øre')),
'PLN': (('zloty', 'zlotys'), ('grosz', 'groszy')),
'MXN': (('peso', 'pesos'), GENERIC_CENTS),
'RON': (('leu', 'leus'), ('ban', 'bani')),
'INR': (('rupia', 'rupias'), ('paisa', 'paisas')),
'HUF': (('florín', 'florines'), ('fillér', 'fillér')),
'FRF': (('franco', 'francos'), ('céntimo', 'céntimos')),
'CNY': (('yuan', 'yuanes'), ('fen', 'jiaos')),
'CZK': (('corona', 'coronas'), ('haléř', 'haléř')),
'NIO': (('córdoba', 'córdobas'), GENERIC_CENTS),
'VES': (('bolívar', 'bolívares'), ('céntimo', 'céntimos')),
'BRL': (('real', 'reales'), GENERIC_CENTS),
'CHF': (('franco', 'francos'), ('céntimo', 'céntimos')),
'JPY': (('yen', 'yenes'), ('sen', 'sen')),
'KRW': (('won', 'wones'), ('jeon', 'jeon')),
'KPW': (('won', 'wones'), ('chon', 'chon')),
'TRY': (('lira', 'liras'), ('kuruş', 'kuruş')),
'ZAR': (('rand', 'rands'), ('céntimo', 'céntimos')),
'KZT': (('tenge', 'tenges'), ('ın', 'ın')),
'UAH': (('hryvnia', 'hryvnias'), ('kopiyka', 'kopiykas')),
'THB': (('baht', 'bahts'), ('satang', 'satang')),
'AED': (('dirham', 'dirhams'), ('fils', 'fils')),
'AFN': (('afghani', 'afghanis'), ('pul', 'puls')),
'ALL': (('lek ', 'leke'), ('qindarkë', 'qindarka')),
'AMD': (('dram', 'drams'), ('luma', 'lumas')),
'ANG': (('florín', 'florines'), GENERIC_CENTS),
'AOA': (('kwanza', 'kwanzas'), ('céntimo', 'céntimos')),
'ARS': (('peso', 'pesos'), GENERIC_CENTS),
'AWG': (('florín', 'florines'), GENERIC_CENTS),
'AZN': (('manat', 'manat'), ('qəpik', 'qəpik')),
'BBD': (GENERIC_DOLLARS, GENERIC_CENTS),
'BDT': (('taka', 'takas'), ('paisa', 'paisas')),
'BGN': (('lev', 'leva'), ('stotinka', 'stotinki')),
'BHD': (('dinar', 'dinares'), ('fils', 'fils')),
'BIF': (('franco', 'francos'), ('céntimo', 'céntimos')),
'BMD': (GENERIC_DOLLARS, GENERIC_CENTS),
'BND': (GENERIC_DOLLARS, GENERIC_CENTS),
'BOB': (('boliviano', 'bolivianos'), GENERIC_CENTS),
'BSD': (GENERIC_DOLLARS, GENERIC_CENTS),
'BTN': (('ngultrum', 'ngultrum'), ('chetrum', 'chetrum')),
'BWP': (('pula', 'pulas'), ('thebe', 'thebes')),
'BYN': (('rublo', 'rublos'), ('kópek', 'kópeks')),
'BYR': (('rublo', 'rublos'), ('kópek', 'kópeks')),
'BZD': (GENERIC_DOLLARS, ('céntimo', 'céntimos')),
'CDF': (('franco', 'francos'), ('céntimo', 'céntimos')),
'CLP': (('peso', 'pesos'), GENERIC_CENTS),
'COP': (('peso', 'pesos'), GENERIC_CENTS),
'CUP': (('peso', 'pesos'), GENERIC_CENTS),
'CVE': (('escudo', 'escudos'), GENERIC_CENTS),
'CYP': (('libra', 'libras'), ('céntimo', 'céntimos')),
'DJF': (('franco', 'francos'), ('céntimo', 'céntimos')),
'DKK': (('corona', 'coronas'), ('øre', 'øre')),
'DOP': (('peso', 'pesos'), GENERIC_CENTS),
'DZD': (('dinar', 'dinares'), ('céntimo', 'céntimos')),
'ECS': (('sucre', 'sucres'), GENERIC_CENTS),
'EGP': (('libra', 'libras'), ('piastra', 'piastras')),
'ERN': (('nakfa', 'nakfas'), ('céntimo', 'céntimos')),
'ETB': (('birr', 'birrs'), ('céntimo', 'céntimos')),
'FJD': (GENERIC_DOLLARS, GENERIC_CENTS),
'FKP': (('libra', 'libras'), ('penny', 'peniques')),
'GEL': (('lari', 'laris'), ('tetri', 'tetris')),
'GHS': (('cedi', 'cedis'), ('pesewa', 'pesewas')),
'GIP': (('libra', 'libras'), ('penique', 'peniques')),
'GMD': (('dalasi', 'dalasis'), ('butut', 'bututs')),
'GNF': (('franco', 'francos'), ('céntimo', 'céntimos')),
'GTQ': (('quetzal', 'quetzales'), GENERIC_CENTS),
'GYD': (GENERIC_DOLLARS, GENERIC_CENTS),
'HKD': (GENERIC_DOLLARS, GENERIC_CENTS),
'HNL': (('lempira', 'lempiras'), GENERIC_CENTS),
'HRK': (('kuna', 'kunas'), ('lipa', 'lipas')),
'HTG': (('gourde', 'gourdes'), ('céntimo', 'céntimos')),
'IDR': (('rupia', 'rupias'), ('céntimo', 'céntimos')),
'ILS': (('séquel', 'séqueles'), ('agora', 'agoras')),
'IQD': (('dinar', 'dinares'), ('fils', 'fils')),
'IRR': (('rial', 'riales'), ('dinar', 'dinares')),
'ISK': (('corona', 'coronas'), ('eyrir', 'aurar')),
'ITL': (('lira', 'liras'), ('céntimo', 'céntimos')),
'JMD': (GENERIC_DOLLARS, ('céntimo', 'céntimos')),
'JOD': (('dinar', 'dinares'), ('piastra', 'piastras')),
'KES': (('chelín', 'chelines'), ('céntimo', 'céntimos')),
'KGS': (('som', 'som'), ('tyiyn', 'tyiyn')),
'KHR': (('riel', 'rieles'), ('céntimo', 'céntimos')),
'KMF': (('franco', 'francos'), ('céntimo', 'céntimos')),
'KWD': (('dinar', 'dinares'), ('fils', 'fils')),
'KYD': (GENERIC_DOLLARS, ('céntimo', 'céntimos')),
'LAK': (('kip', 'kips'), ('att', 'att')),
'LBP': (('libra', 'libras'), ('piastra', 'piastras')),
'LKR': (('rupia', 'rupias'), ('céntimo', 'céntimos')),
'LRD': (GENERIC_DOLLARS, ('céntimo', 'céntimos')),
'LSL': (('loti', 'lotis'), ('céntimo', 'céntimos')),
'LTL': (('lita', 'litas'), ('céntimo', 'céntimos')),
'LVL': (('lat', 'lats'), ('céntimo', 'céntimos')),
'LYD': (('dinar', 'dinares'), ('dírham', 'dírhams')),
'MAD': (('dírham', 'dirhams'), ('céntimo', 'céntimos')),
'MDL': (('leu', 'lei'), ('ban', 'bani')),
'MGA': (('ariary', 'ariaris'), ('iraimbilanja', 'iraimbilanja')),
'MKD': (('denar', 'denares'), ('deni', 'denis')),
'MMK': (('kiat', 'kiats'), ('pya', 'pyas')),
'MNT': (('tugrik', 'tugriks'), ('möngö', 'möngö')),
'MOP': (('pataca', 'patacas'), ('avo', 'avos')),
'MRO': (('ouguiya', 'ouguiyas'), ('khoums', 'khoums')),
'MRU': (('ouguiya', 'ouguiyas'), ('khoums', 'khoums')),
'MUR': (('rupia', 'rupias'), ('céntimo', 'céntimos')),
'MVR': (('rufiyaa', 'rufiyaas'), ('laari', 'laari')),
'MWK': (('kuacha', 'kuachas'), ('tambala', 'tambalas')),
'MYR': (('ringgit', 'ringgit'), ('céntimo', 'céntimos')),
'MZN': (('metical', 'metical'), GENERIC_CENTS),
'NAD': (GENERIC_DOLLARS, ('céntimo', 'céntimos')),
'NGN': (('naira', 'nairas'), ('kobo', 'kobo')),
'NPR': (('rupia', 'rupias'), ('paisa', 'paisas')),
'NZD': (GENERIC_DOLLARS, GENERIC_CENTS),
'OMR': (('rial', 'riales'), ('baisa', 'baisa')),
'PAB': (('balboa', 'balboas'), ('centésimo', 'centésimos')),
'PGK': (('kina', 'kinas'), ('toea', 'toea')),
'PHP': (('peso', 'pesos'), GENERIC_CENTS),
'PKR': (('rupia', 'rupias'), ('paisa', 'paisas')),
'PLZ': (('zloty', 'zlotys'), ('grosz', 'groszy')),
'PYG': (('guaraní', 'guaranís'), ('céntimo', 'céntimos')),
'QAR': (('rial', 'riales'), ('dírham', 'dírhams')),
'QTQ': (('quetzal', 'quetzales'), GENERIC_CENTS),
'RSD': (('dinar', 'dinares'), ('para', 'para')),
'RUR': (('rublo', 'rublos'), ('kopek', 'kopeks')),
'RWF': (('franco', 'francos'), ('céntimo', 'céntimos')),
'SAR': (('riyal', 'riales'), ('halala', 'halalas')),
'SBD': (GENERIC_DOLLARS, ('céntimo', 'céntimos')),
'SCR': (('rupia', 'rupias'), ('céntimo', 'céntimos')),
'SDG': (('libra', 'libras'), ('piastra', 'piastras')),
'SGD': (GENERIC_DOLLARS, ('céntimo', 'céntimos')),
'SHP': (('libra', 'libras'), ('penny', 'peniques')),
'SKK': (('corona', 'coronas'), ('halier', 'haliers')),
'SLL': (('leona', 'leonas'), ('céntimo', 'céntimos')),
'SRD': (GENERIC_DOLLARS, ('céntimo', 'céntimos')),
'SSP': (('libra', 'libras'), ('piastra', 'piastras')),
'STD': (('dobra', 'dobras'), ('céntimo', 'céntimos')),
'SVC': (('colón', 'colones'), GENERIC_CENTS),
'SYP': (('libra', 'libras'), ('piastra', 'piastras')),
'SZL': (('lilangeni', 'emalangeni'), ('céntimo', 'céntimos')),
'TJS': (('somoni', 'somonis'), ('dirame', 'dirames')),
'TMT': (('manat', 'manat'), ('tenge', 'tenge')),
'TND': (('dinar', 'dinares'), ('milésimo', 'milésimos')),
'TOP': (('paanga', 'paangas'), ('céntimo', 'céntimos')),
'TTD': (GENERIC_DOLLARS, ('céntimo', 'céntimos')),
'TWD': (('nuevo dólar', 'nuevos dolares'), ('céntimo', 'céntimos')),
'TZS': (('chelín', 'chelines'), ('céntimo', 'céntimos')),
'UAG': (('hryvnia', 'hryvnias'), ('kopiyka', 'kopiykas')),
'UGX': (('chelín', 'chelines'), ('céntimo', 'céntimos')),
'UYU': (('peso', 'pesos'), ('centésimo', 'centésimos')),
'UZS': (('sum', 'sum'), ('tiyin', 'tiyin')),
'VEF': (('bolívar fuerte', 'bolívares fuertes'),
('céntimo', 'céntimos')),
'VND': (('dong', 'dongs'), ('xu', 'xu')),
'VUV': (('vatu', 'vatu'), ('nenhum', 'nenhum')),
'WST': (('tala', 'tala'), GENERIC_CENTS),
'XAF': (('franco CFA', 'francos CFA'), ('céntimo', 'céntimos')),
'XCD': (GENERIC_DOLLARS, ('céntimo', 'céntimos')),
'XOF': (('franco CFA', 'francos CFA'), ('céntimo', 'céntimos')),
'XPF': (('franco CFP', 'francos CFP'), ('céntimo', 'céntimos')),
'YER': (('rial', 'riales'), ('fils', 'fils')),
'YUM': (('dinar', 'dinares'), ('para', 'para')),
'ZMW': (('kwacha', 'kwachas'), ('ngwee', 'ngwee')),
'ZRZ': (('zaire', 'zaires'), ('likuta', 'makuta')),
'ZWL': (GENERIC_DOLLARS, ('céntimo', 'céntimos')),
'ZWL': (GENERIC_DOLLARS, ('céntimo', 'céntimos')),
}
# //CHECK: Is this sufficient??
GIGA_SUFFIX = None
MEGA_SUFFIX = "illón"
def setup(self):
lows = ["cuatr", "tr", "b", "m"]
self.high_numwords = self.gen_high_numwords([], [], lows)
self.negword = "menos "
self.pointword = "punto"
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 = ["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é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):
ctext, cnum, ntext, nnum = curr + next
if cnum == 1:
if nnum < 1000000:
return next
ctext = "un"
elif cnum == 100 and not nnum % 1000 == 0:
ctext += "t" + self.gender_stem
if nnum < cnum:
if cnum < 100:
return "%s y %s" % (ctext, ntext), cnum + nnum
return "%s %s" % (ctext, ntext), cnum + nnum
elif (not nnum % 1000000) and cnum > 1:
ntext = ntext[:-3] + "lones"
if nnum == 100:
if cnum == 5:
ctext = "quinien"
ntext = ""
elif cnum == 7:
ctext = "sete"
elif cnum == 9:
ctext = "nove"
ntext += "t" + self.gender_stem + "s"
else:
ntext = " " + ntext
return (ctext + ntext, cnum * nnum)
def to_ordinal(self, value):
self.verify_ordinal(value)
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:
# Round down to the nearest 1e(3n)
# dec contains the following:
# [ 1e3, 1e6): 1e3
# [ 1e6, 1e9): 1e6
# [ 1e9, 1e12): 1e9
# [1e12, 1e15): 1e12
# [1e15, 1e18): 1e15
dec = 1000 ** int(math.log(int(value), 1000))
# Split the parts before and after the word for 'dec'
# eg (12, 345) = divmod(12_345, 1_000)
high_part, low_part = divmod(value, dec)
cardinal = self.to_cardinal(high_part) if high_part != 1 else ""
text = (
"%s%s%s %s" % (cardinal, self.ords[dec], self.gender_stem,
self.to_ordinal(low_part))
)
else:
text = self.to_cardinal(value)
return text.strip()
def to_ordinal_num(self, value):
self.verify_ordinal(value)
return "%s%s" % (value, "º" if self.gender_stem == 'o' else "ª")
def to_currency(self, val, currency='EUR', cents=True, separator=' con',
adjective=False):
result = super(Num2Word_ES, self).to_currency(
val, currency=currency, cents=cents, separator=separator,
adjective=adjective)
# Handle exception, in spanish is "un euro" and not "uno euro"
# except in this currencies: leona, corona,
# libra, rupia, lempira, peseta, is 'una'
# but only when it's first word, otherwise
# it's replaced in others words like 'veintiun'
if currency in CURRENCIES_UNA:
list_result = result.split(" ")
if list_result[0] == "uno":
list_result[0] = list_result[0].replace("uno", "una")
result = " ".join(list_result)
result = result.replace("uno", "un")
return result