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.