Convertir de cantidad a importe con letra en pesos mediante PHP

Necesitaba una función que pudiera traducir una cantidad dada con centavos a el total con letra, es decir escrito, para un sistema de facturación con PHP, encontré una función excelente en BLASTEN.com y me tome la libertad de moverle un poquito para hacer que la salida fuera exactamente como la necesitaba, es decir, incluyendo “X PESOS xx/100 M.N.”

Todo el crédito es para la gente de Blasten, pero le puse un poquito mas de sabor para quienes me leen y lo puedan utilizar con mayor facilidad.

Importante: La función por el momento solo acepta 2 decimales y el formato del numero tiene que ser xxx.xx, así que pueden utilizar number_format() para limpiar la variable antes de pasarla por la función.

Para utilizarlo, solo descarguen el código, péguenlo en su script o hagan un include con la ruta al fichero que pueden descargar aquí, de cualquier forma, lo único necesario es utilizar:

echo num2letras($var);

No queda mas que desearles happy coding!

num2letras en php

  • samuel

    excelente aporte
    saludos

  • pchiz

    Graciasss neneeeeeeeeeeeeeee. Muy cheto!

  • @pchiz Que bueno que te gusto! 🙂

  • bukanor

    muy bueno, agradesco tu aporte y a blasten.com, me sirvio mucho a la hora de imprimir mis tickets atravez de mi sistema basado en web. number_format($Total,2,’.’,’,’);

  • Zilus

    Gracias por leer el blog Bukanor

  • MayLore

    Excelente!!! Gracias por el aporte Zilus 🙂

  • Carlos

    Muchas gracias! Funciona excelente y me ayudó bastante 😀

  • me ha ayudado bastante y me has ahorrado mucho trabajo.. gracias!

  • Arturo

    gracias funciona perfecto…

  • Luis

    EXCELENTE!

    Saludos

  • Luis Escobar

    Muy bien!!

    solo que hice un pequeño cambio al final.. por algunos errores que me salieron..

    //Zi hack –> return ucfirst($tex);

    if(strlen($float[1])==1){
    $end_num=ucfirst($tex).’ pesos ‘.$float[1].’0/100 M.N.’;
    }else{
    $end_num=ucfirst($tex).’ pesos ‘.$float[1].’/100 M.N.’;
    }

  • Uriel

    deberia ser :
    if(strlen($float[1])==0){
    $end_num=ucfirst($tex).’ pesos ‘.$float[1].’0/100 M.N.’;
    }else{
    $end_num=ucfirst($tex).’ pesos ‘.$float[1].’/100 M.N.’;
    }

  • guillermo

    Excelente mi pana, mejore la calidad del software de impresion de cheques, te felicito por el aporte y agredecido.

  • arnold8a

    Muchas gracias!! excelente!!

  • Oscar

    Genial aporte amigo muy bueno funciona a las mil maravillas

  • Juanjo

    Esta chingona muchas gracias

  • DONDE TE BESO EL TRASERO?

  • Angel Becerra

    Excelente trabajo, solo me di cuenta que al imprimir una cantidad como $100 (cien pesos), nos da “Ciento pesos 00/100 M.N.”, pero por lo demás funciona perfecto.

  • julio

    tengo un problema, tengo una sumatoria de variables (subtotal, iva, total)
    subtotal = 7241.38
    iva = 1158.62
    total= 8400.00
    el texto en letra me sale:
    Ocho mil cuatrocientos pesos 0008/100 M.N.

  • Alvaro Garcia

    Muy buena la funcion, PERO todavia falta ajustarle en la validacion, cuando los valores son 1 millon, 2 millones y asi sucesivamente, por que le queda faltando la palabra DE ..

    Ejemplo si se escribe 5.000.000,25 este devuelve Cinco millones pesos 25/100 M.N. (falta la palabra DE).

  • Alvaro Garcia

    Bueno, aqui hice el ajuste para que muestre la palabra DE cuando es millon.
    al principio. despues de la linea: $matmil[16] = ‘millones de billones de trillones’;
    desclaras esto
    $de = ”;

    despues de
    //Zi hack
    $float=explode(‘.’,$num);
    $num=$float[0];
    escribes esta linea
    if ($num % 1000000 == 0) {$de = ‘ de ‘;}

    al final del codigo concatenas con el monto final asi:
    $end_num=ucfirst($tex).$de.’ pesos ‘.$float[1].’0/100 M.N.’;

  • Alvaro Garcia

    El error que se tiene de los CIENTOS se soluciona de esta manera:
    las lineas que tiene este codigo:
    if ($n == 1) {
    $t = ‘ ciento’ . $t;
    }elseif ($n == 5){

    Se reemplazan por este:
    if ($n == 1) {
    if ($num == ‘100’ )
    {$t = ‘ cien’ . $t; }
    else
    {$t = ‘ ciento’ . $t; }
    }elseif ($n == 5){

    Y listo, Cualquier otro problema me pueden contactar alvagar@gmail.com

  • rafael

    Gracias muy bueno

  • Excelente función! muy útil

  • Juan Manuel Torres

    barbaro funciona al 100 thnks

  • Te vas a ir al cielo con todo y zapatos mi estimado… Me salvaste la vida. Estoy haciendo un módulo de facturación electrónica y es justo lo que necesitaba!! Mil Gracias por el aporte!!

  • Hector G

    El cambio que indica ALVARO GARCIA tiene el detalle de un error de dedo, debe ser así:

    if ($n == 1) {
    if ($num == ’100’ )
    {$t = ‘ cien’ . $t; }
    else
    {$t = ‘ ciento’ . $t; }
    }elseif ($n == 5){

    alguna versión para el DE de millones ??

  • Adrian

    Su puta madre gracias por este aporte 🙂

  • Excelente Aporte Hermano, Me sirvió mucho! (Y)

  • pepe aguilar

    Hola Gracias por el aporte.

    Hector G, yo lo hice de la siguiente forma:

    //Zi hack –> return ucfirst($tex);
    $de = ($float[0]%1000000 == 0) ? ‘ de ‘ : ” ;

    if (!isset($float[1]) || (isset($float[1]) && strlen($float[1]) == 0))
    {
    $end_num = ucfirst($tex) . $de . ‘ pesos ‘ . $float[1] . ’00/100 M.N.’;
    }
    else
    {
    $end_num = ucfirst($tex) . $de . ‘ pesos ‘ . $float[1] . ‘/100 M.N.’;
    }

  • sebas

    puta madre

  • FOV777

    Muy buena realmente muy buen codigo se le agradece mucho por el aporte

  • Bruce

    Me encanta tu post, me ha ayudado mucho.
    Gracias, por personas como tú el conocimiento aumenta y mejora para bien.
    🙂

  • Jorge

    Buena publicacion de codigo… lo trate de implementar en un proyecto escolar, pero no logro que funcione a lo que necesito adaptarlo.

    Alguien pudiera ayudarme.

    declaro una variable la cual recupera el dato numerico de un input text llamado total
    $cant=$_POST[‘total’];

    y con el sig. codigo quiero mostrar la cantidad numerica pero en letras

    y cada vez que ejecuto el formulario donde tengo el recibo siempre aparece cero nunca cambia quisiera saber como hacer para que cada vez que el valor en el input total cambie tambien en el texto cambia el valor

  • Para eso necesitas Javascript!

    Ahorita estoy super ocupado, pero te paso el tip al rato!

  • Jorge

    Gracias zilus, ya que aun sigo sin poder aplicar el codigo a mi necesidad la cual es la sig:

    // En un formulario tengo las sig tres columnas en las cuales el usuario selecciona la clave y aparece el concepto correspondiente ya solo tiene que ingresar el Costo (son trece datos de costo en trece input text) tengo validado para que reciba tipo double y sume cada costo ingresado por el usuario y lo muestre en el input text TOTAL; asi cada costo ingresado lo va sumando y mostrando esto con javascript.

    ******************************************************
    Seleccione Clave / Concepto / Ingrese Costo
    ****************************************************
    – / /
    – / /
    – / /
    *****************************************************
    TOTAL /
    *****************************************************
    [ input text ]
    CANTIDAD CON LETRA
    *****************************************************

    Lo que necesito adecuar es que si total contiene una cantidad esa cantidad se muestre en un inpux text o con un echo, dentro dl mismo formulario sin necesidad de actualizar la pagina.

    Otra opcion seria que la cantidad que tenga total se convirtiera a texto y se almacenara en una variable para recuperarla en otro formulario. Ya que ls datos d este formulario ya los puedo enviar a imprimir con FPDF. Solo me falta la cantidad con letra.

    te agradezco la atencion prestada

  • Noe

    muchas gracias!! excelente aporte!! me sirvio un chingo!! je

  • Gracias. Genial!!!!

    Muchas gracias, me hiciste un parote (“favor, ayuda”).

  • Christian Romero

    Me sirvió bastante muchas gracias!

  • Daniel

    Excelente!!! Muchas gracias!

  • diego martinez

    Gracias muy buen aporte!!

  • Gracias, sirve al 100 por ciento, gracias por compartirlo

  • man! excelente código, me ahoraste muchas horas.

  • Jaider Mendoza

    Espectacular…
    Muchas gracias por ese gran aporte.

  • Alberto Villa

    Eres genial…. Un millón de gracias.

  • Luis

    Muuuchas gracias por el código compadrito hizo parototote 😛 saludos!!

  • Camilo Uribe

    Hola, muchas gracias por el aporte, funciona bien aunque me aparece este error cuando lo ejecuto

    Notice: Undefined offset: 1 in G:\USBWebserver\root\fpdf\function\numtoletters.php on line 177

    es decir la linea :

    $end_num=ucfirst($tex).’ pesos ‘.$float[1].’/100 M.N.’;

    que puede ser, lo cambie por los demas y nada

  • usuario php

    muchas gracias muy buen aporte !!!!! 😀

  • Ruth Morales

    Muy buena función…

  • Pingback: canadian payday loans()

  • Pingback: direct payday loans quick approval lender()

  • Pingback: drugrehabcentershotline.com substance abuse counselor()

  • José Carlos Ortiz Hernández

    Muy buena Zilus me ayudo mucho, Solo Agregaría la siguiente condición para evitar el offset del arreglo;
    //Si el arreglo es mayor que 1 tiene decimales, en caso contrario es 0
    if(count($float)>1){
    $end_num=ucfirst($tex).’ pesos ‘.$float[1].’/100 M.N.’;
    }else{
    $end_num=ucfirst($tex).’ pesos 00/100 M.N.’;
    }
    return $end_num;

  • Zilus

    Gracias José Carlos!

  • Luis Alberto Hernandez Monroy

    Gracias muy buena función !

  • Ricardo Antonio Canul Celis

    excelente funcion! gracias!

  • Julio Alvarado

    gracias la probare

Suscribete ahora

Suscríbete y recibe información valiosa sobre UI, UX, CX y otras soluciones informáticas