spellmoney
Convierte montos numéricos a letras, con el formato exacto que exigen los documentos legales y financieros — cheques, facturas, recibos y contratos: CIENTO VEINTICINCO DÓLARES CON 50/100.
Existe también el puerto a TypeScript/JavaScript — misma lógica, mismos datos de moneda, mismo resultado exacto — para quien trabaja en Node.
Instalación
pip install spellmoney
Uso
from spellmoney import a_letras
a_letras(125.50)
# 'CIENTO VEINTICINCO DÓLARES CON 50/100'
a_letras(1, moneda="GTQ")
# 'UN QUETZAL CON 00/100'
a_letras(21000000, moneda="EUR")
# 'VEINTIÚN MILLONES DE EUROS CON 00/100'
a_letras(2, moneda="GBP", mayusculas=False)
# 'dos libras esterlinas con 00/100'
a_letras(10.50, centavos="palabras")
# 'DIEZ DÓLARES CON CINCUENTA CENTAVOS'
a_letras("125.50")
# 'CIENTO VEINTICINCO DÓLARES CON 50/100' (lectura decimal exacta)
Otros idiomas
a_letras(125.50, idioma="en")
# 'ONE HUNDRED TWENTY-FIVE DOLLARS AND 50/100'
a_letras(125.50, idioma="pt", moneda="BRL")
# 'CENTO E VINTE E CINCO REAIS E 50/100'
a_letras(125.50, idioma="fr", moneda="EUR")
# 'CENT VINGT-CINQ EUROS ET 50/100'
Solo el número, sin moneda
from spellmoney import (
numero_a_letras,
numero_a_letras_en,
numero_a_letras_pt,
numero_a_letras_fr,
)
numero_a_letras(1000000) # 'un millón'
numero_a_letras(1000000000) # 'mil millones' (¡no "un billón"!)
numero_a_letras(1000000000000) # 'un billón'
numero_a_letras_en(1000000000) # 'one billion' (escala corta del inglés)
numero_a_letras_pt(21, "f") # 'vinte e uma' (concordancia de género)
numero_a_letras_fr(71) # 'soixante et onze' (base vigesimal del francés)
Monedas soportadas
Las 154 divisas activas del estándar ISO 4217. La cobertura varía según el idioma:
| Idioma | Divisas cubiertas |
|---|---|
es (español) |
154 — todas |
en (inglés) |
154 — todas |
pt (portugués, Brasil) |
46 — países lusófonos + las divisas más usadas del mundo |
fr (francés) |
45 — países francófonos + las divisas más usadas del mundo |
Si se pide una combinación de moneda e idioma que aún no existe, a_letras lanza SpellMoneyError con un mensaje explicando exactamente qué falta, en vez de fallar en silencio.
🙋 Ayuda buscada
Portugués y francés todavía tienen huecos en divisas regionales. Los pasos exactos para contribuir (fork, rama, pruebas, Pull Request) están en CONTRIBUTING.md — en español e inglés.
API
| Función | Descripción |
|---|---|
a_letras(monto, moneda="USD", idioma="es", centavos="fraccion", mayusculas=True) |
Convierte un monto con nombre de moneda. monto puede ser int, float, Decimal o cadena decimal. |
numero_a_letras(n) |
Solo el número, en español. |
numero_a_letras_en(n) |
Solo el número, en inglés. |
numero_a_letras_pt(n, genero="m") |
Solo el número, en portugués. |
numero_a_letras_fr(n) |
Solo el número, en francés. |
MONEDAS |
Catálogo de las 154 divisas ISO 4217. |
IDIOMAS |
("es", "en", "pt", "fr"). |
SpellMoneyError |
Error lanzado ante un monto, moneda o idioma inválidos. |
Parámetros de a_letras:
monto—int,float,Decimalo cadena decimal ("125.50").moneda— código ISO 4217. Por defecto"USD".idioma—"es","en","pt"o"fr". Por defecto"es".centavos—"fraccion"escribe50/100;"palabras"escribeCINCUENTA CENTAVOS.mayusculas—Truedevuelve el resultado en mayúsculas;False, en minúsculas.
Rango soportado
Enteros de 0 a 999,999,999,999,999. Un monto fuera de ese rango lanza SpellMoneyError, igual que un monto negativo, una moneda no reconocida o un idioma no soportado.
Redondeo y precisión
Un monto se puede pasar como float, como Decimal o como cadena decimal, y la diferencia importa:
- Cadena o
Decimal—a_letras("125.50"),a_letras(Decimal("125.50")): los dígitos se leen tal como fueron escritos, sin pasar por punto flotante. El redondeo del tercer decimal en adelante es half-up exacto, así que"2.675"da68/100. Es la vía recomendada cuando el monto viene de una base de datos, un formulario o un archivo. float—a_letras(125.50): los montos de dos decimales se convierten de forma exacta. Verificado sobre el millón de montos de0.00a9999.99: ninguna diferencia frente a aritmética decimal exacta. Con tres o más decimales, el empate exacto se resuelve según el valor binario que elfloatalmacena realmente, que puede quedar apenas por debajo del decimal escrito:2.675da67/100. Es una propiedad del tipofloat, no de esta librería.
Desarrollo
git clone https://github.com/brandriver-bit/spellmoney.git
cd spellmoney
pip install -e ".[dev]"
pytest
Licencia
MIT — ver LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file spellmoney-1.1.0.tar.gz.
File metadata
- Download URL: spellmoney-1.1.0.tar.gz
- Upload date:
- Size: 21.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e2fbb9c1c2dbb1db4e8189d1c193f5787308d5790438ebbfae2e18c63cedf814
|
|
| MD5 |
104218382ccba929bbc89dd6d4519848
|
|
| BLAKE2b-256 |
0b1a374b22e9549f3e7548fce47e4da745e88cd5f44b5084f54c145a7df926a4
|
File details
Details for the file spellmoney-1.1.0-py3-none-any.whl.
File metadata
- Download URL: spellmoney-1.1.0-py3-none-any.whl
- Upload date:
- Size: 17.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7f7ba09fe3770992936ea38d59134b8c2d103eca64ec7c8aeacf452aea3a76e4
|
|
| MD5 |
e82c619069de36ef0813498d5efcdf3c
|
|
| BLAKE2b-256 |
9a74b44c8405286d3343425c3e52f198c4e131fc221cff3e67dfa63acda91913
|