javascript

Javascript: Número o moneda a texto / letras

Introducción

Cuando trabajamos con documentos contables, o con cosas que llevan una cantidad, a veces es necesario convertir los números a texto.

Esto pasa sobre todo cuando queremos convertir dinero a una representación legible, es decir, a letras o a texto.

Por ejemplo, convertir “123.00” a (al menos en México) “Ciento veintitrés pesos con cero centavos” o algo así.

Hoy me vi en la necesidad de ello y en lugar de escribir por mí mismo el código, busqué si alguien ya o había hecho, y así fue.

Número a letras

Como lo dije, esta función no es mía. Buscando en Google encontré este gist. Pero de donde realmente me basé para utilizar la función fue de un comentario hecho por un usuario llamado sapienman.

En fin, el código es este:

var numeroALetras = (function() {
    // Código basado en el comentario de @sapienman
    // Código basado en https://gist.github.com/alfchee/e563340276f89b22042a
    function Unidades(num) {

        switch (num) {
            case 1:
                return 'UN';
            case 2:
                return 'DOS';
            case 3:
                return 'TRES';
            case 4:
                return 'CUATRO';
            case 5:
                return 'CINCO';
            case 6:
                return 'SEIS';
            case 7:
                return 'SIETE';
            case 8:
                return 'OCHO';
            case 9:
                return 'NUEVE';
        }

        return '';
    } //Unidades()

    function Decenas(num) {

        let decena = Math.floor(num / 10);
        let unidad = num - (decena * 10);

        switch (decena) {
            case 1:
                switch (unidad) {
                    case 0:
                        return 'DIEZ';
                    case 1:
                        return 'ONCE';
                    case 2:
                        return 'DOCE';
                    case 3:
                        return 'TRECE';
                    case 4:
                        return 'CATORCE';
                    case 5:
                        return 'QUINCE';
                    default:
                        return 'DIECI' + Unidades(unidad);
                }
            case 2:
                switch (unidad) {
                    case 0:
                        return 'VEINTE';
                    default:
                        return 'VEINTI' + Unidades(unidad);
                }
            case 3:
                return DecenasY('TREINTA', unidad);
            case 4:
                return DecenasY('CUARENTA', unidad);
            case 5:
                return DecenasY('CINCUENTA', unidad);
            case 6:
                return DecenasY('SESENTA', unidad);
            case 7:
                return DecenasY('SETENTA', unidad);
            case 8:
                return DecenasY('OCHENTA', unidad);
            case 9:
                return DecenasY('NOVENTA', unidad);
            case 0:
                return Unidades(unidad);
        }
    } //Unidades()

    function DecenasY(strSin, numUnidades) {
        if (numUnidades > 0)
            return strSin + ' Y ' + Unidades(numUnidades)

        return strSin;
    } //DecenasY()

    function Centenas(num) {
        let centenas = Math.floor(num / 100);
        let decenas = num - (centenas * 100);

        switch (centenas) {
            case 1:
                if (decenas > 0)
                    return 'CIENTO ' + Decenas(decenas);
                return 'CIEN';
            case 2:
                return 'DOSCIENTOS ' + Decenas(decenas);
            case 3:
                return 'TRESCIENTOS ' + Decenas(decenas);
            case 4:
                return 'CUATROCIENTOS ' + Decenas(decenas);
            case 5:
                return 'QUINIENTOS ' + Decenas(decenas);
            case 6:
                return 'SEISCIENTOS ' + Decenas(decenas);
            case 7:
                return 'SETECIENTOS ' + Decenas(decenas);
            case 8:
                return 'OCHOCIENTOS ' + Decenas(decenas);
            case 9:
                return 'NOVECIENTOS ' + Decenas(decenas);
        }

        return Decenas(decenas);
    } //Centenas()

    function Seccion(num, divisor, strSingular, strPlural) {
        let cientos = Math.floor(num / divisor)
        let resto = num - (cientos * divisor)

        let letras = '';

        if (cientos > 0)
            if (cientos > 1)
                letras = Centenas(cientos) + ' ' + strPlural;
            else
                letras = strSingular;

        if (resto > 0)
            letras += '';

        return letras;
    } //Seccion()

    function Miles(num) {
        let divisor = 1000;
        let cientos = Math.floor(num / divisor)
        let resto = num - (cientos * divisor)

        let strMiles = Seccion(num, divisor, 'UN MIL', 'MIL');
        let strCentenas = Centenas(resto);

        if (strMiles == '')
            return strCentenas;

        return strMiles + ' ' + strCentenas;
    } //Miles()

    function Millones(num) {
        let divisor = 1000000;
        let cientos = Math.floor(num / divisor)
        let resto = num - (cientos * divisor)

        let strMillones = Seccion(num, divisor, 'UN MILLON DE', 'MILLONES DE');
        let strMiles = Miles(resto);

        if (strMillones == '')
            return strMiles;

        return strMillones + ' ' + strMiles;
    } //Millones()

    return function NumeroALetras(num, currency) {
        currency = currency || {};
        let data = {
            numero: num,
            enteros: Math.floor(num),
            centavos: (((Math.round(num * 100)) - (Math.floor(num) * 100))),
            letrasCentavos: '',
            letrasMonedaPlural: currency.plural || 'PESOS CHILENOS', //'PESOS', 'Dólares', 'Bolívares', 'etcs'
            letrasMonedaSingular: currency.singular || 'PESO CHILENO', //'PESO', 'Dólar', 'Bolivar', 'etc'
            letrasMonedaCentavoPlural: currency.centPlural || 'CHIQUI PESOS CHILENOS',
            letrasMonedaCentavoSingular: currency.centSingular || 'CHIQUI PESO CHILENO'
        };

        if (data.centavos > 0) {
            data.letrasCentavos = 'CON ' + (function() {
                if (data.centavos == 1)
                    return Millones(data.centavos) + ' ' + data.letrasMonedaCentavoSingular;
                else
                    return Millones(data.centavos) + ' ' + data.letrasMonedaCentavoPlural;
            })();
        };

        if (data.enteros == 0)
            return 'CERO ' + data.letrasMonedaPlural + ' ' + data.letrasCentavos;
        if (data.enteros == 1)
            return Millones(data.enteros) + ' ' + data.letrasMonedaSingular + ' ' + data.letrasCentavos;
        else
            return Millones(data.enteros) + ' ' + data.letrasMonedaPlural + ' ' + data.letrasCentavos;
    };

})();

Ahora hay que ver su modo de uso.

Modo de uso

Pegamos todo el código de arriba en un script, y luego lo importamos en HTML. Por ejemplo…

<head>
  <script src="numeroALetras.js" type="text/javascript"></script> 
</head>

Ahora podemos llamar a la función globalmente. Como primer parámetro pasamos el número, y como segundo parámetro un objeto con opciones:

  • plural: el plural de nuestra moneda. Por ejemplo, “dólares” o “pesos”.
  • singular: el singular de nuestra moneda. Por ejemplo “dólar” o “peso”
  • centPlural: el plural de las fracciones de nuestra moneda. En mi caso es “centavos”
  • centSingular: el singular de las fracciones de nuestra moneda. En mi caso es “centavo”

Así que, podemos llamarlo así:

numeroALetras(200.58, {
  plural: "PESOS",
  singular: "PESO",
  centPlural: "CENTAVOS",
  centSingular: "CENTAVO"
});

Con este resultado:

Si no queremos estar pasando el segundo argumento cada vez que llamemos a la función, sigamos leyendo.

Modo de uso sin objeto

Pero si lo vamos a usar muchas veces, no vamos a llamarlo con el objeto con la configuración en cada momento. Mejor modificamos la función original 😉

Especificamente vamos a modificar las líneas 169, 170, 171 y 172. Como podemos ver, el autor asigna valores por defecto en caso de no pasar las opciones.

Así que cambiaríamos “PESOS CHILENOS” y todas las demás cosas por nuestra moneda. Después, sólo llamaríamos a la función así:

numeroALetras(200.58);

Ejemplo de implementación

He escrito un ejemplo para que veas cómo se usa, míralo: ejemplo de conversión de dinero a texto en JS.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

    • El código es open source. Cuando usted quiera, puede agregar esa característica y publicarla

  • ¿Como hago para implementarlo si el numero lo obtengo mediante un promt y quiero que el resultado se muestre en consola?

  • Y como le hago para implementarlo si el numero lo recibo mediante un promt y quiero que el resultado se muestre en la consola ??

  • Hola, queria saber cómo recibo los resultados para mandarlos a un input, sería la forma; llamando a la función y pasarle como parametro el valor del input que tiene el valor a convertir de numeros a letras, y como recibo la variable con las letras para escribirlas o pasarlas a otro input?

    • Mmm no entiendo bien tu pregunta, pero puedes agregar un listener al input:

      document.querySelector("#idDelInput").addEventListener("change", function(){
      let cantidad = this.value;
      // Aquí convierte el valor
      // y ponlo en donde lo quieras mostrar
      });

      Espero que funcione :) saludos

  • Muchas gracias parzibyte. He encontrado este código en otras página pero nadie te dice como implementarlo. Como yo no soy desarrollador no tengo idea de javascript o HTML (aunque programé en mis años mozos). Sin embargo, tu Modo de Uso me iluminó y pude emplear el código en un "workflow engine" de un sitio que me permite tener mi base de datos. Nuevamente gracias a tí y a @sapienman

    • Me da mucho gusto que te haya funcionado. Así es, a veces algunos desarrolladores suponemos que ya todos saben cómo usar las cosas, pero nos equivocamos; por eso trato de explicar las cosas un poco más detalladas sin llegar a aburrir al lector. Gracias por tus comentarios :-)

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.