agrego el script encargado de pasar a letras el monto de un valor numérico que se le pasa
This commit is contained in:
121
numeros_a_letras.py
Normal file
121
numeros_a_letras.py
Normal file
@@ -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()
|
||||||
Reference in New Issue
Block a user