Created
December 30, 2024 21:16
-
-
Save 4DRIAN0RTIZ/b9bd4f05d1f88b1842ebcd514332edca to your computer and use it in GitHub Desktop.
Numero a letras
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
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