Skip to content

Instantly share code, notes, and snippets.

@4DRIAN0RTIZ
Created December 30, 2024 21:16
Show Gist options
  • Save 4DRIAN0RTIZ/b9bd4f05d1f88b1842ebcd514332edca to your computer and use it in GitHub Desktop.
Save 4DRIAN0RTIZ/b9bd4f05d1f88b1842ebcd514332edca to your computer and use it in GitHub Desktop.
Numero a letras
"""
numero_a_letras_decimal.py
Convierte un número decimal a letras en el sistema monetario mexicano.
Ejemplo:
$ python numero_a_letras_decimal.py 1234.56
Salida:
mil doscientos treinta y cuatro pesos con cincuenta y seis centavos M.X.N
Copyleft 2024, Adrian Ortiz Bustos
"""
import argparse
def convertir_a_letras(numero):
if numero == 0:
return "cero pesos M.X.N"
if numero < 0:
return "menos " + convertir_a_letras(-numero)
palabras = []
# Separar la parte entera y decimal
entero = int(numero)
decimal = round((numero - entero) * 100)
# Procesar la parte entera
palabras_entero = convertir_entero_a_letras(entero)
palabras.append(palabras_entero)
palabras.append("pesos") # Agregar "pesos" después de la parte entera
# Procesar la parte decimal si existe
if decimal > 0:
palabras.append("con")
palabras_decimal = convertir_entero_a_letras(decimal)
palabras.append(palabras_decimal)
palabras.append("centavos")
palabras.append("M.X.N") # Agregar "M.X.N" al final
return " ".join(palabras).strip()
def convertir_entero_a_letras(numero):
if numero == 0:
return ""
palabras = []
if numero < 30:
especiales = {
1: "uno", 2: "dos", 3: "tres", 4: "cuatro", 5: "cinco",
6: "seis", 7: "siete", 8: "ocho", 9: "nueve", 10: "diez",
11: "once", 12: "doce", 13: "trece", 14: "catorce", 15: "quince",
16: "dieciséis", 17: "diecisiete", 18: "dieciocho",
19: "diecinueve", 20: "veinte", 21: "veintiuno", 22: "veintidós",
23: "veintitrés", 24: "veinticuatro", 25: "veinticinco",
26: "veintiséis", 27: "veintisiete", 28: "veintiocho", 29: "veintinueve"
}
palabras.append(especiales[numero])
elif numero < 100:
decenas = ["", "", "veinte", "treinta", "cuarenta", "cincuenta",
"sesenta", "setenta", "ochenta", "noventa"]
decena = numero // 10
unidad = numero % 10
if unidad == 0:
palabras.append(decenas[decena])
else:
palabras.append(f"{decenas[decena]} y {convertir_entero_a_letras(unidad)}")
elif numero < 1000:
if numero == 100:
palabras.append("cien")
else:
centenas = ["", "ciento", "doscientos", "trescientos", "cuatrocientos", "quinientos",
"seiscientos", "setecientos", "ochocientos", "novecientos"]
centenas_index = numero // 100
palabras.append(centenas[centenas_index])
resto = numero % 100
if resto > 0:
palabras.append(convertir_entero_a_letras(resto))
elif numero < 1_000_000:
miles = numero // 1000
resto = numero % 1000
if miles == 1:
palabras.append("mil")
else:
palabras.append(f"{convertir_entero_a_letras(miles)} mil")
if resto > 0:
palabras.append(convertir_entero_a_letras(resto))
elif numero < 1_000_000_000:
millones = numero // 1_000_000
resto = numero % 1_000_000
if millones == 1:
palabras.append("un millón")
else:
palabras.append(f"{convertir_entero_a_letras(millones)} millones")
if resto > 0:
palabras.append(convertir_entero_a_letras(resto))
else:
palabras.append("número demasiado grande")
return " ".join(palabras).strip()
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("numero", type=float, help="Número a convertir a letras")
args = parser.parse_args()
resultado = convertir_a_letras(args.numero)
print(resultado)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment