Convertir Números a Letras en JavaScript
Función JS para convertir números a letras. Funciona en navegador y Node.js. Cópiala en tu proyecto y úsala directamente. Sin npm, sin librerías.
Función completa
Copia este bloque en tu archivo .js o .ts:
function numeroALetras(numero) {
const UNIDADES = ['', 'uno', 'dos', 'tres', 'cuatro', 'cinco', 'seis',
'siete', 'ocho', 'nueve', 'diez', 'once', 'doce',
'trece', 'catorce', 'quince', 'dieciséis', 'diecisiete',
'dieciocho', 'diecinueve'];
const DECENAS = ['', '', 'veinte', 'treinta', 'cuarenta', 'cincuenta',
'sesenta', 'setenta', 'ochenta', 'noventa'];
const CENTENAS = ['', 'ciento', 'doscientos', 'trescientos', 'cuatrocientos',
'quinientos', 'seiscientos', 'setecientos', 'ochocientos',
'novecientos'];
function convertirEntero(n) {
if (n === 0) return 'cero';
if (n < 0) return 'menos ' + convertirEntero(-n);
if (n === 100) return 'cien';
let resultado = '';
if (n >= 1000000) {
const m = Math.floor(n / 1000000);
resultado += (m === 1 ? 'un millón ' : convertirEntero(m) + ' millones ');
n %= 1000000;
}
if (n >= 1000) {
const m = Math.floor(n / 1000);
resultado += (m === 1 ? 'mil ' : convertirEntero(m) + ' mil ');
n %= 1000;
}
if (n >= 100) {
resultado += CENTENAS[Math.floor(n / 100)] + ' ';
n %= 100;
}
if (n >= 20) {
resultado += (n % 10 === 0)
? DECENAS[Math.floor(n / 10)]
: DECENAS[Math.floor(n / 10)] + ' y ' + UNIDADES[n % 10];
} else if (n > 0) {
resultado += UNIDADES[n];
}
return resultado.trim();
}
const parteEntera = Math.floor(numero);
const parteDecimal = Math.round((numero - parteEntera) * 100);
let resultado = convertirEntero(parteEntera);
if (parteDecimal > 0) {
resultado += ' con ' + parteDecimal + '/100';
}
return resultado;
}
Usa Math.floor() para la parte entera y Math.round() para la decimal,
evitando problemas de precisión de punto flotante.
Cómo instalar o importar
Sin paquetes npm. Solo cópiala en tu proyecto.
En el navegador (HTML directo)
Inclúyela en un <script> en tu HTML. La función estará disponible globalmente.
Como módulo ES (ES Modules)
Con Vite, Webpack, Rollup o Next.js, exporta como módulo ES:
// archivo: utils/numeroALetras.js
export function numeroALetras(numero) {
// ... código de la función ...
}
// En tu componente o archivo principal:
import { numeroALetras } from './utils/numeroALetras.js';
console.log(numeroALetras(1500)); // "mil quinientos" En Node.js (CommonJS)
// archivo: utils/numeroALetras.js
function numeroALetras(numero) {
// ... código de la función ...
}
module.exports = { numeroALetras };
// En tu archivo principal:
const { numeroALetras } = require('./utils/numeroALetras');
console.log(numeroALetras(1500)); // "mil quinientos" Cómo usar
// Números básicos
console.log(numeroALetras(0)); // "cero"
console.log(numeroALetras(15)); // "quince"
console.log(numeroALetras(100)); // "cien"
console.log(numeroALetras(150)); // "ciento cincuenta"
console.log(numeroALetras(1500)); // "mil quinientos"
console.log(numeroALetras(10000)); // "diez mil"
console.log(numeroALetras(100000)); // "cien mil"
console.log(numeroALetras(1000000)); // "un millón"
console.log(numeroALetras(2500000)); // "dos millones quinientos mil"
// Con decimales
console.log(numeroALetras(15250.75)); // "quince mil doscientos cincuenta con 75/100"
// Números negativos
console.log(numeroALetras(-500)); // "menos quinientos" Ejemplo en el DOM de una factura:
const total = 15250.75;
document.getElementById('total-letras').textContent =
numeroALetras(total) + ' PESOS M.N.'; Casos de prueba
Ejecuta estos casos para verificar que funciona:
const 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'],
];
let errores = 0;
pruebas.forEach(([numero, esperado]) => {
const resultado = numeroALetras(numero);
const estado = resultado === esperado ? 'OK' : '✘';
if (resultado !== esperado) errores++;
console.log(`${estado} ${numero} → ${resultado} (esperado: ${esperado})`);
});
console.log(`\nTotal: ${pruebas.length - errores}/${pruebas.length} pasaron`); Decimales
Decimales a fracción sobre cien automáticamente: numeroALetras(15250.75)
→ «quince mil doscientos cincuenta con 75/100». Para más precisión:
// Para 3 decimales
const parteDecimal = Math.round((numero - parteEntera) * 1000);
if (parteDecimal > 0) {
resultado += ' con ' + parteDecimal + '/1000';
}
// Para 4 decimales
const parteDecimal = Math.round((numero - parteEntera) * 10000);
if (parteDecimal > 0) {
resultado += ' con ' + parteDecimal + '/10000';
} Pesos mexicanos
Agrega «PESOS M.N.» al resultado:
function numeroALetrasMXN(numero) {
return numeroALetras(numero) + ' PESOS M.N.';
}
console.log(numeroALetrasMXN(1500)); // "mil quinientos PESOS M.N."
console.log(numeroALetrasMXN(15250.75)); // "quince mil doscientos cincuenta con 75/100 PESOS M.N."
console.log(numeroALetrasMXN(1000000)); // "un millón PESOS M.N." Compatibilidad
ES6+. Chrome, Firefox, Safari, Edge y Node.js 12+. Para IE11, reemplaza
const/let por var.
Herramienta Online
Convierte números a letras directamente en tu navegador.
Más Lenguajes
Código en Python, Java, PHP y VBA para Excel.
VBA para Excel
Macro lista para usar en Excel con formato para cheques.