JavaScript: pasar número a letras (switch)

Este sería un bonito código con switch para pasar tus números a letras, admite del 1 al 99.999, pero es muy sencillo de ir ampliando.

function formatearALetra() {
//en el HTML podéis poner este elemento con el input del usuario
    var num = document.getElementById("numero").value;
    console.log(formatNumeroToString(num));
};

function formatNumeroToString(numero) {
    if (isNaN(numero) || numero < 1 || numero > 99999)
        throw "número no válido";
    return decenamillar(numero);
}

function decenamillar(numero) {
    if (numero < 10)
        return unidad(numero);
    if (numero < 99)
        return decena(numero);
    if (numero < 999)
        return centena(numero);
    if (numero < 9999)                  
        return millar(numero);          
    if (numero > 99999)
        throw "decena millar no válido";

    var mil = numero.toString().substring(0, 2);
    return decena(mil) + " mil " + centena(numero.toString().substring(2));
}

function millar(numero) {
    if (numero < 10)
        return unidad(numero);
    if (numero < 99)
        return decena(numero);
    if (numero < 999)                  
        return centena(numero);          
    if (numero > 9999)
        throw "millar no válido";

    var mil = numero.toString().substring(0, 1);

    return mil !== "1"
        ? unidad(mil) + " mil " + centena(numero.toString().substring(1))
        : "mil " + centena(numero.toString().substring(1));
}

function centena(numero) {

    if (numero < 10)
        return unidad(numero);
    if (numero < 99)                  
        return decena(numero);     
    if (numero > 999)
        throw "centena no válido";
    if (numero === "100")
        return "cien";
    var cen = numero.toString().substring(0, 1);
    switch (cen) {
    case "1":
        cen = "ciento";
        break;
    case "2":
        cen = "doscientos";
        break;
    case "3":
        cen = "trescientos";
        break;
    case "4":
        cen = "cuatrocientos";
        break;
    case "5":
        cen = "quinientos";
        break;
    case "6":
        cen = "seiscientos";
        break;
    case "7":
        cen = "setecientos";
        break;
    case "8":
        cen = "ochocientos";
        break;
    case "9":
        cen = "novecientos";
        break;

    };
    return cen + " " + decena(numero.toString().substring(1));
}

function decena(numero) {
    numero = parseInt(numero, 10);
    if (numero < 10)                  
        return unidad(numero);      
    if (numero > 99)
        throw "decena no válido";

    switch (numero) {
    case 10:
        return "diez";
    case 11:
        return "once";
    case 12:
        return "doce";
    case 13:
        return "trece";
    case 14:
        return "catorce";
    case 15:
        return "quince";
    case 20:
        return "veinte";
    case 30:
        return "treinta";
    case 40:
        return "cuarenta";
    case 50:
        return "cincuenta";
    case 60:
        return "sesenta";
    case 70:
        return "setenta";
    case 80:
        return "ochenta";
    case 90:
        return "noventa";
    default:
        var uni = numero.toString().substring(numero.toString().length - 1);
        return decenaExcepcion(numero) + unidad(uni);
    }
};

function decenaExcepcion(num) {
    var primero = num.toString().substring(0, 1);
    switch (primero) {
    case "1":
        return "dieci";
    case "2":
        return "veinti";
    default:
        return decena(primero + "0") + " y ";
    }
}

function unidad(numero) {
    numero = parseInt(numero, 10);
    if (numero < 0 || numero > 9)
        throw "unidad no válido";

    switch (numero) {
    case 1:
        return "uno";
    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";
    default:
        return "";
    }
}
Anuncios