Convertir Números a Letras en PHP

Función PHP para convertir números a letras. Pégala en tu archivo y llama numero_a_letras(1500). Funciona con Laravel, WordPress o cualquier framework. Sin Composer.

Función completa

Copia el código y pégalo en tu archivo PHP. Compatible con PHP 7.4+:

<?php

function numero_a_letras(float $numero): string {
    $unidades = ['', 'uno', 'dos', 'tres', 'cuatro', 'cinco', 'seis',
                 'siete', 'ocho', 'nueve', 'diez', 'once', 'doce',
                 'trece', 'catorce', 'quince', 'dieciséis', 'diecisiete',
                 'dieciocho', 'diecinueve'];
    $decenas = ['', '', 'veinte', 'treinta', 'cuarenta', 'cincuenta',
                'sesenta', 'setenta', 'ochenta', 'noventa'];
    $centenas = ['', 'ciento', 'doscientos', 'trescientos', 'cuatrocientos',
                 'quinientos', 'seiscientos', 'setecientos', 'ochocientos',
                 'novecientos'];

    $convertir_entero = function (int $n) use (&$convertir_entero, $unidades, $decenas, $centenas): string {
        if ($n === 0) return 'cero';
        if ($n < 0) return 'menos ' . $convertir_entero(-$n);
        if ($n === 100) return 'cien';
        $resultado = '';
        if ($n >= 1000000) {
            $m = intdiv($n, 1000000);
            $resultado .= ($m === 1 ? 'un millón ' : $convertir_entero($m) . ' millones ');
            $n %= 1000000;
        }
        if ($n >= 1000) {
            $m = intdiv($n, 1000);
            $resultado .= ($m === 1 ? 'mil ' : $convertir_entero($m) . ' mil ');
            $n %= 1000;
        }
        if ($n >= 100) {
            $resultado .= $centenas[intdiv($n, 100)] . ' ';
            $n %= 100;
        }
        if ($n >= 20) {
            $resultado .= ($n % 10 === 0)
                ? $decenas[intdiv($n, 10)]
                : $decenas[intdiv($n, 10)] . ' y ' . $unidades[$n % 10];
        } elseif ($n > 0) {
            $resultado .= $unidades[$n];
        }
        return trim($resultado);
    };

    $parte_entera = (int) $numero;
    $parte_decimal = (int) round(($numero - $parte_entera) * 100);
    $resultado = $convertir_entero($parte_entera);
    if ($parte_decimal > 0) {
        $resultado .= ' con ' . $parte_decimal . '/100';
    }
    return $resultado;
}

Usa una closure recursiva con use (&$convertir_entero) para mantener los arreglos sin variables globales. Si usas PHP anterior a 7.0, reemplaza intdiv($a, $b) por intval($a / $b).

Cómo usar

// Ejemplos básicos
echo numero_a_letras(0);           // cero
echo numero_a_letras(15);          // quince
echo numero_a_letras(100);         // cien
echo numero_a_letras(150);         // ciento cincuenta
echo numero_a_letras(1500);        // mil quinientos
echo numero_a_letras(10000);       // diez mil
echo numero_a_letras(100000);      // cien mil
echo numero_a_letras(1000000);     // un millón
echo numero_a_letras(2500000);     // dos millones quinientos mil

// Con decimales
echo numero_a_letras(15250.75);    // quince mil doscientos cincuenta con 75/100

// Números negativos
echo numero_a_letras(-500);        // menos quinientos

Ejemplo en Laravel (Blade template o servicio):

// En un controlador de Laravel
public function generarFactura(Request $request) {
    $total = $request->input('total');
    $totalLetras = numero_a_letras($total);

    return view('facturas.show', [
        'total' => $total,
        'total_letras' => $totalLetras,
    ]);
}

// En la vista Blade
<p>Son: {{ $total_letras }} PESOS M.N.</p>

También puedes envolverla en una clase de utilidades:

class Utilidades {
    public static function numeroALetras(float $numero): string {
        return numero_a_letras($numero);
    }
}

echo Utilidades::numeroALetras(1500); // mil quinientos

Casos de prueba

Ejecuta estos casos para verificar que funciona:

$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'],
];

$errores = 0;
foreach ($pruebas as [$numero, $esperado]) {
    $resultado = numero_a_letras($numero);
    $estado = ($resultado === $esperado) ? 'OK' : '✘';
    if ($resultado !== $esperado) $errores++;
    echo "[$estado] $numero -> $resultado (esperado: $esperado)\n";
}
echo "\nTotal: " . (count($pruebas) - $errores) . "/" . count($pruebas) . " pasaron\n";

Decimales

Decimales a fracción sobre cien: numero_a_letras(15250.75) → «quince mil doscientos cincuenta con 75/100». Para más precisión:

// Para 3 decimales
$parte_decimal = (int) round(($numero - $parte_entera) * 1000);
if ($parte_decimal > 0) {
    $resultado .= ' con ' . $parte_decimal . '/1000';
}

// Para 4 decimales
$parte_decimal = (int) round(($numero - $parte_entera) * 10000);
if ($parte_decimal > 0) {
    $resultado .= ' con ' . $parte_decimal . '/10000';
}

Pesos mexicanos

Agrega «PESOS M.N.» al resultado:

function numero_a_letras_mxn(float $numero): string {
    return numero_a_letras($numero) . ' PESOS M.N.';
}

// Ejemplos
echo numero_a_letras_mxn(1500);      // mil quinientos PESOS M.N.
echo numero_a_letras_mxn(15250.75);  // quince mil doscientos cincuenta con 75/100 PESOS M.N.
echo numero_a_letras_mxn(1000000);   // un millón PESOS M.N.

Requisitos y compatibilidad

PHP puro, compatible con PHP 7.4, 8.0, 8.1, 8.2, 8.3+. Sin Composer. Funciona con Laravel, Symfony, CodeIgniter, WordPress, CakePHP y Zend/Laminas. Guarda el archivo en UTF-8 para que los acentos se muestren correctamente.

Herramienta Online

Convierte números a letras directamente en tu navegador.

Más Lenguajes

Código en Python, JavaScript, Java y VBA para Excel.

Método para Excel

Guía paso a paso para convertir números a letras en Excel.