Conversión de Números a Letras con JavaScript

Otra funcionalidad que a veces es necesaria es la conversión de números a letras, en un proyecto, se nos presentó esta necesidad y el código pues le pertenece a un colega. Provecho!

Muchas gracias por sus comentarios, y debido a ello haré un cambio para que les sea más fácil hacer uso del código o comentarlo. Agradezco los comentarios de Geyser y Jean en los que han hecho contribución.

El código ahora se encuentra en Gist y les dejo el vínculo a él:

Si deseas ver el código anterior, es éste:

/*************************************************************/
// NumeroALetras
// @author   Rodolfo Carmona
/*************************************************************/
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 "";
}

function Decenas(num){

  decena = Math.floor(num/10);
  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){

  centenas = Math.floor(num / 100);
  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){
  cientos = Math.floor(num / divisor)
  resto = num - (cientos * divisor)

  letras = "";

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

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

  return letras;
}//Seccion()

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

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

  if(strMiles == "")
    return strCentenas;

  return strMiles + " " + strCentenas;

  //return Seccion(num, divisor, "UN MIL", "MIL") + " " + Centenas(resto);
}//Miles()

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

  strMillones = Seccion(num, divisor, "UN MILLON", "MILLONES");
  strMiles = Miles(resto);

  if(strMillones == "")
    return strMiles;

  return strMillones + " " + strMiles;

  //return Seccion(num, divisor, "UN MILLON", "MILLONES") + " " + Miles(resto);
}//Millones()

function NumeroALetras(num){
  var data = {
    numero: num,
    enteros: Math.floor(num),
    centavos: (((Math.round(num * 100)) - (Math.floor(num) * 100))),
    letrasCentavos: "",
    letrasMonedaPlural: "CORDOBAS",
    letrasMonedaSingular: "CORDOBA"
  };

  if (data.centavos > 0)
    data.letrasCentavos = "CON " + data.centavos + "/100";

  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;
}//NumeroALetras()
Anuncios

9 thoughts on “Conversión de Números a Letras con JavaScript

  1. Muy buen aporte solo que en la funcion de miles tenias un error si tenias un cantidad exacta como 2,000 te ponia DOS MIL undefined PESOS bueno yo lo cambie a pesos… Lo corregi de la siguiente manera espero los sirva.

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

    strMiles = Seccion(num, divisor, “UN MIL”, “MIL”);
    strCentenas = Centenas(resto);
    if(resto === 0){
    strMiles = strMiles;
    }
    if(strMiles === “” && resto > 0){
    strMiles = strCentenas;
    }
    if(strMiles !== “” && resto > 0){
    strMiles = strMiles + ” ” + strCentenas;
    }

    return strMiles;

    //return Seccion(num, divisor, “UN MIL”, “MIL”) + ” ” + Centenas(resto);
    }//Miles()

  2. En en el cambio que deje me equivoque en el orden de los if el ultimo if

    if(strMiles !== “” && resto > 0){
    strMiles = strMiles + ” ” + strCentenas;
    }
    solo ponganlo arriba de los demas es que si lo deja asi, si ponen una cantidad como 207 pone 2 veces el nombre

    SALUDOS!

  3. que tal!, aqui pongo mi aporte jeje, LOS CENTAVOS A LETRAS. Es el mismo código solo que lo necesitaba con los centavos en letras para un proyecto. Gracias Rodolfo Carmona:
    /*************************************************************/
    // NumeroALetras
    // @author Rodolfo Carmona
    /*************************************************************/
    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 “”;
    }

    function Decenas(num){

    decena = Math.floor(num/10);
    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){

    centenas = Math.floor(num / 100);
    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){
    cientos = Math.floor(num / divisor)
    resto = num – (cientos * divisor)

    letras = “”;

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

    if (resto > 0)
    letras += “”;

    return letras;
    }//Seccion()

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

    strMiles = Seccion(num, divisor, “UN MIL”, “MIL”);
    strCentenas = Centenas(resto);

    if(strMiles == “”)
    return strCentenas;

    return strMiles + ” ” + strCentenas;

    //return Seccion(num, divisor, “UN MIL”, “MIL”) + ” ” + Centenas(resto);
    }//Miles()

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

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

    if(strMillones == “”)
    return strMiles;

    return strMillones + ” ” + strMiles;

    //return Seccion(num, divisor, “UN MILLON”, “MILLONES”) + ” ” + Miles(resto);
    }//Millones()

    function NumeroALetras(num){
    var data = {
    numero: num,
    enteros: Math.floor(num),
    centavos: (((Math.round(num * 100)) – (Math.floor(num) * 100))),
    letrasCentavos: “”,
    letrasMonedaPlural: “PESOS”,
    letrasMonedaSingular: “PESO”,

    letrasMonedaCentavoPlural: “CENTAVOS”,
    letrasMonedaCentavoSingular: “CENTAVO”
    };

    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;
    }//NumeroALetras()

  4. lo modifique para que sirva en las facturas lo dejo por aca
    function NumeroALetrasf(num){
    //num=num.value;
    var data = {
    numero: num,
    enteros: Math.floor(num),
    centavos: (((Math.round(num * 100)) – (Math.floor(num) * 100))),
    letrasCentavos: “”,
    letrasMonedaPlural: “NUEVOS SOLES”,
    letrasMonedaSingular: “SOL”
    };

    if(data.centavos==0)
    data.centavos=”00″;
    else
    if(data.centavos 0)
    data.letrasCentavos = “CON ” + data.centavos + “/100” ;

    if(data.enteros == 0)
    //return “CERO ” + data.letrasMonedaPlural + ” ” + data.letrasCentavos;
    if (data.centavos <= 0)
    return "CERO " + " " + data.letrasCentavos + " " + "CON " + data.centavos + "/100 " + data.letrasMonedaPlural ;
    else
    return "CERO " + " " + data.letrasCentavos + " " + data.letrasMonedaPlural ;
    if (data.enteros == 1)
    //return Millones(data.enteros) + " " + data.letrasMonedaSingular + " " + data.letrasCentavos;
    if (data.centavos <= 0)
    return Millones(data.enteros) + " " + data.letrasCentavos + "CON " + data.centavos + "/100 " + data.letrasMonedaPlural;
    else
    return Millones(data.enteros) + " " + data.letrasCentavos + " " + data.letrasMonedaPlural;
    else
    //return Millones(data.enteros) + " " + data.letrasMonedaPlural + " " + data.letrasCentavos;
    if (data.centavos <= 0)
    return Millones(data.enteros) + " " + data.letrasCentavos+ " " + "CON " + data.centavos + "/100 " + data.letrasMonedaPlural ;
    else
    return Millones(data.enteros) + " " + data.letrasCentavos+ " " + data.letrasMonedaPlural ;
    }

  5. jean :
    Tu comentario está pendiente de moderación.
    lo modifique para que sirva en las facturas lo dejo por aca
    function NumeroALetrasf(num){
    //num=num.value;
    var data = {
    numero: num,
    enteros: Math.floor(num),
    centavos: (((Math.round(num * 100)) – (Math.floor(num) * 100))),
    letrasCentavos: “”,
    letrasMonedaPlural: “NUEVOS SOLES”,
    letrasMonedaSingular: “SOL”
    };
    if(data.centavos==0)
    data.centavos=”00″;
    else
    if(data.centavos 0)
    data.letrasCentavos = “CON ” + data.centavos + “/100″ ;
    if(data.enteros == 0)
    //return “CERO ” + data.letrasMonedaPlural + ” ” + data.letrasCentavos;
    if (data.centavos <= 0)
    return “CERO ” + ” ” + data.letrasCentavos + ” ” + “CON ” + data.centavos + “/100 ” + data.letrasMonedaPlural ;
    else
    return “CERO ” + ” ” + data.letrasCentavos + ” ” + data.letrasMonedaPlural ;
    if (data.enteros == 1)
    //return Millones(data.enteros) + ” ” + data.letrasMonedaSingular + ” ” + data.letrasCentavos;
    if (data.centavos <= 0)
    return Millones(data.enteros) + ” ” + data.letrasCentavos + “CON ” + data.centavos + “/100 ” + data.letrasMonedaPlural;
    else
    return Millones(data.enteros) + ” ” + data.letrasCentavos + ” ” + data.letrasMonedaPlural;
    else
    //return Millones(data.enteros) + ” ” + data.letrasMonedaPlural + ” ” + data.letrasCentavos;
    if (data.centavos <= 0)
    return Millones(data.enteros) + ” ” + data.letrasCentavos+ ” ” + “CON ” + data.centavos + “/100 ” + data.letrasMonedaPlural ;
    else
    return Millones(data.enteros) + ” ” + data.letrasCentavos+ ” ” + data.letrasMonedaPlural ;
    }

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s