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.