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} &rarr; ${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.