From 8159175d537f1cf3c4d74d31c52e21d61f2eb0b8 Mon Sep 17 00:00:00 2001 From: Dulce Figueredo Date: Thu, 23 Apr 2026 11:01:06 -0300 Subject: [PATCH] =?UTF-8?q?agrego=20el=20script=20encargado=20de=20pasar?= =?UTF-8?q?=20a=20letras=20el=20monto=20de=20un=20valor=20num=C3=A9rico=20?= =?UTF-8?q?que=20se=20le=20pasa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- numeros_a_letras.py | 121 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 numeros_a_letras.py diff --git a/numeros_a_letras.py b/numeros_a_letras.py new file mode 100644 index 0000000..ff10aa3 --- /dev/null +++ b/numeros_a_letras.py @@ -0,0 +1,121 @@ +def main(): + import re + import decimal + + _UNIDADES = ["CERO","UNO","DOS","TRES","CUATRO","CINCO","SEIS","SIETE","OCHO","NUEVE"] + _ESPECIALES = { + 10:"DIEZ",11:"ONCE",12:"DOCE",13:"TRECE",14:"CATORCE",15:"QUINCE", + 16:"DIECISEIS",17:"DIECISIETE",18:"DIECIOCHO",19:"DIECINUEVE" + } + _DECENAS = ["","DIEZ","VEINTE","TREINTA","CUARENTA","CINCUENTA","SESENTA","SETENTA","OCHENTA","NOVENTA"] + _CENTENAS = ["","CIENTO","DOSCIENTOS","TRESCIENTOS","CUATROCIENTOS","QUINIENTOS","SEISCIENTOS","SETECIENTOS","OCHOCIENTOS","NOVECIENTOS"] + + def _hasta_999(n: int) -> str: + if n < 10: + return _UNIDADES[n] + if 10 <= n < 20: + return _ESPECIALES[n] + if 20 <= n < 30: + if n == 20: + return "VEINTE" + return "VEINTI" + _UNIDADES[n - 20] + if n < 100: + d, u = divmod(n, 10) + return _DECENAS[d] if u == 0 else (_DECENAS[d] + " Y " + _UNIDADES[u]) + if n == 100: + return "CIEN" + if n < 1000: + c, r = divmod(n, 100) + return _CENTENAS[c] if r == 0 else (_CENTENAS[c] + " " + _hasta_999(r)) + return str(n) + + def numero_a_palabras_es(n: int) -> str: + if n < 0: + return "MENOS " + numero_a_palabras_es(-n) + if n < 1000: + return _hasta_999(n) + if n < 1_000_000: + miles, resto = divmod(n, 1000) + pref = "MIL" if miles == 1 else (_hasta_999(miles) + " MIL") + return pref if resto == 0 else (pref + " " + _hasta_999(resto)) + if n < 1_000_000_000: + millones, resto = divmod(n, 1_000_000) + pref = "UN MILLON" if millones == 1 else (numero_a_palabras_es(millones) + " MILLONES") + return pref if resto == 0 else (pref + " " + numero_a_palabras_es(resto)) + return str(n) + + def _normalizar_numero(valor) -> str: + s = str(valor).strip() + s = re.sub(r"[^0-9,\.\-]", "", s) + + if s == "" or s.lower() == "false": + return "" + + # Si tiene , y . => el último separador es el decimal + if "," in s and "." in s: + if s.rfind(",") > s.rfind("."): + # 1.234,56 -> 1234.56 + return s.replace(".", "").replace(",", ".") + else: + # 1,234.56 -> 1234.56 + return s.replace(",", "") + + # Solo coma: coma decimal (y comas previas como miles) + if "," in s: + parts = s.split(",") + if len(parts) > 2: + return "".join(parts[:-1]) + "." + parts[-1] + return s.replace(",", ".") + + # Solo punto: si hay varios puntos, los anteriores son miles + if s.count(".") > 1: + parts = s.split(".") + return "".join(parts[:-1]) + "." + parts[-1] + + return s + + def numero_decimal_a_palabras_es(valor, max_decimales=2) -> str: + s = _normalizar_numero(valor) + if s == "": + return "" + + try: + d = decimal.Decimal(s) + except Exception: + return str(valor) + + max_decimales = int(max_decimales) + + if max_decimales <= 0: + d = d.quantize(decimal.Decimal("1"), rounding=decimal.ROUND_HALF_UP) + else: + q = decimal.Decimal("1." + ("0" * max_decimales)) + d = d.quantize(q, rounding=decimal.ROUND_HALF_UP) + + sign = "MENOS " if d < 0 else "" + d_abs = abs(d) + + ent = int(d_abs) + if max_decimales <= 0: + return (sign + numero_a_palabras_es(ent)).strip() + + dec_str = format(d_abs, "f").split(".")[1] # conserva ceros por quantize + dec = int(dec_str) if dec_str else 0 + + if dec == 0: + return (sign + numero_a_palabras_es(ent)).strip() + + return (sign + numero_a_palabras_es(ent) + " PUNTO " + numero_a_palabras_es(dec)).strip() + + # ---- Rocketbot ---- + saldo_a_pagar = GetVar("monto_saldo") # sin llaves + saldo_a_pagar_letras = numero_decimal_a_palabras_es(saldo_a_pagar, max_decimales=2) + + # sufijo requerido + if saldo_a_pagar_letras.strip() != "": + saldo_a_pagar_letras = "DOLARES AMERICANOS " + saldo_a_pagar_letras.strip() + + SetVar("saldo_a_pagar_letras", saldo_a_pagar_letras) + +# IMPORTANTE: llamar la función +main() \ No newline at end of file