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