Convertir Números a Letras en Python
Función Python para convertir números a letras. Cópiala, pégala en tu archivo y llámala con
numero_a_letras(1500). Sin dependencias. Incluye variante para pesos mexicanos.
Función completa (código listo para usar)
Copia todo el bloque y pégalo en tu archivo Python:
def numero_a_letras(numero: float) -> str:
UNIDADES = ['', 'uno', 'dos', 'tres', 'cuatro', 'cinco', 'seis', 'siete',
'ocho', 'nueve', 'diez', 'once', 'doce', 'trece', 'catorce',
'quince', 'dieciséis', 'diecisiete', 'dieciocho', 'diecinueve']
DECENAS = ['', '', 'veinte', 'treinta', 'cuarenta', 'cincuenta', 'sesenta',
'setenta', 'ochenta', 'noventa']
CENTENAS = ['', 'ciento', 'doscientos', 'trescientos', 'cuatrocientos',
'quinientos', 'seiscientos', 'setecientos', 'ochocientos',
'novecientos']
def convertir_entero(n: int) -> str:
if n == 0:
return 'cero'
if n < 0:
return 'menos ' + convertir_entero(-n)
if n == 100:
return 'cien'
resultado = ''
if n >= 1_000_000:
m = n // 1_000_000
resultado += ('un millón ' if m == 1
else convertir_entero(m) + ' millones ')
n %= 1_000_000
if n >= 1_000:
m = n // 1_000
resultado += ('mil ' if m == 1
else convertir_entero(m) + ' mil ')
n %= 1_000
if n >= 100:
resultado += CENTENAS[n // 100] + ' '
n %= 100
if n >= 20:
resultado += (DECENAS[n // 10] if n % 10 == 0
else DECENAS[n // 10] + ' y ' + UNIDADES[n % 10])
elif n > 0:
resultado += UNIDADES[n]
return resultado.strip()
parte_entera = int(numero)
parte_decimal = round((numero - parte_entera) * 100)
resultado = convertir_entero(parte_entera)
if parte_decimal > 0:
resultado += f' con {parte_decimal}/100'
return resultado Cómo usar
# Ejemplos básicos
print(numero_a_letras(0)) # cero
print(numero_a_letras(15)) # quince
print(numero_a_letras(100)) # cien
print(numero_a_letras(150)) # ciento cincuenta
print(numero_a_letras(1500)) # mil quinientos
print(numero_a_letras(10000)) # diez mil
print(numero_a_letras(100000)) # cien mil
print(numero_a_letras(1000000)) # un millón
print(numero_a_letras(2500000)) # dos millones quinientos mil
print(numero_a_letras(15250.75)) # quince mil doscientos cincuenta con 75/100
print(numero_a_letras(-500)) # menos quinientos Ejemplo en una factura CFDI:
def formatear_factura(total: float) -> str:
"""Devuelve el total formateado en letras para una factura."""
return f"Total: {numero_a_letras(total)} PESOS M.N."
print(formatear_factura(15250.75))
# Total: quince mil doscientos cincuenta con 75/100 PESOS M.N. Casos de prueba
Ejecuta estos casos para verificar que funciona correctamente: para producción. Puedes copiar este bloque directamente en un archivo de pruebas:
# Casos de prueba
pruebas = [
(0, "cero"),
(5, "cinco"),
(15, "quince"),
(20, "veinte"),
(21, "veintiuno"),
(30, "treinta"),
(35, "treinta y cinco"),
(100, "cien"),
(101, "ciento uno"),
(200, "doscientos"),
(500, "quinientos"),
(1000, "mil"),
(1500, "mil quinientos"),
(10000, "diez mil"),
(100000, "cien mil"),
(1000000, "un millón"),
(2000000, "dos millones"),
(2500000, "dos millones quinientos mil"),
(1234567, "un millón doscientos treinta y cuatro mil quinientos sesenta y siete"),
(1500.50, "mil quinientos con 50/100"),
(15250.75, "quince mil doscientos cincuenta con 75/100"),
(-500, "menos quinientos"),
]
for numero, esperado in pruebas:
resultado = numero_a_letras(numero)
estado = "OK" if resultado == esperado else "✘"
print(f"[{estado}] {numero} -> {resultado} (esperado: {esperado})") Cómo manejar decimales
La función convierte decimales a fracción sobre cien automáticamente: 15250.75
→ «quince mil doscientos cincuenta con 75/100». Para la mayoría de casos
(facturas, cheques, nóminas), dos decimales son suficientes.
Si necesitas más precisión, modifica esta línea:
# Para 3 decimales
parte_decimal = round((numero - parte_entera) * 1000)
if parte_decimal > 0:
resultado += f' con {parte_decimal}/1000'
# Para 4 decimales
parte_decimal = round((numero - parte_entera) * 10000)
if parte_decimal > 0:
resultado += f' con {parte_decimal}/10000' Cómo adaptar para pesos mexicanos
Envuelve la función para agregar «PESOS M.N.»:
def numero_a_letras_mxn(numero: float) -> str:
"""Convierte un número a letras en formato para pesos mexicanos."""
resultado = numero_a_letras(numero)
return f"{resultado} PESOS M.N."
# Ejemplos
print(numero_a_letras_mxn(1500)) # mil quinientos PESOS M.N.
print(numero_a_letras_mxn(15250.75)) # quince mil doscientos cincuenta con 75/100 PESOS M.N.
print(numero_a_letras_mxn(1000000)) # un millón PESOS M.N. Requisitos y compatibilidad
Python puro, compatible con Python 3.8+. Sin paquetes externos. Las anotaciones de tipo
(: float, -> str) son opcionales. Funciona en scripts, Flask,
Django, FastAPI y Jupyter.
Herramienta Online
Convierte números a letras directamente en tu navegador.
Más Lenguajes
Código en JavaScript, Java, PHP y VBA para Excel.
VBA para Excel
Macro lista para usar en Excel con formato para cheques.