JavaScript numbers to Words

前端 未结 24 1663
死守一世寂寞
死守一世寂寞 2020-11-22 14:39

I\'m trying to convert numbers into english words, for example 1234 would become: \"one thousand two hundred thirty four\".

My Tact

24条回答
  •  再見小時候
    2020-11-22 15:08

    If anybody ever wants to do this but in Spanish (en español), here's my code based on Hardik's

    function num2str(num, moneda) {
        moneda = moneda || (num !== 1 ? "pesos" : "peso");
        var fraction = Math.round(__cf_frac(num) * 100);
        var f_text = " (" + pad(fraction, 2) + "/100 M.N.)";
    
    
        return __cf_convert_number(num) + " " + moneda + f_text;
    }
    
    function __cf_frac(f) {
        return f % 1;
    }
    
    function __cf_convert_number(number) {
        if ((number < 0) || (number > 999999999)) {
            throw Error("N\u00famero fuera de rango");
        }
        var millon = Math.floor(number / 1000000);
        number -= millon * 1000000;
        var cientosDeMiles = Math.floor(number / 100000);
        number -= cientosDeMiles * 100000;
        var miles = Math.floor(number / 1000);
        number -= miles * 1000;
        var centenas = Math.floor(number / 100);
        number = number % 100;
        var tn = Math.floor(number / 10);
        var one = Math.floor(number % 10);
        var res = "";
    
        var cientos = Array("", "cien", "doscientos", "trescientos", "cuatrocientos", "quinientos", "seiscientos", "setecientos", "ochocientos", "novecientos");
        if (millon > 0) {
            res += (__cf_convert_number(millon) + (millon === 1 ? " mill\u00f3n" : " millones"));
        }
        if (cientosDeMiles > 0) {
            res += (((res == "") ? "" : " ") +
                cientos[cientosDeMiles] + (miles > 0 || centenas > 0 || tn > 0 || one < 0 ? (cientosDeMiles == 1 ? "to " : " ") : ""));
        }
        if (miles > 0) {
            res += (((res == "") ? "" : " ") +
                __cf_convert_number(miles) + " mil");
        }
        if (centenas) {
            res += (((res == "") ? "" : " ") +
                cientos[centenas] + (tn > 0 || one > 0 ? (centenas > 1 ? " " : "to ") : ""));
        }
    
    
        var ones = Array("", "un", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve", "diez", "once", "doce", "trece", "catorce", "quince", "dieciseis", "diecisiete", "dieciocho", "diecinueve");
        var tens = Array("", "", "veinte", "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa");
    
        if (tn > 0 || one > 0) {
            if (tn < 2) {
                res += ones[tn * 10 + one];
            }
            else {
                if (tn === 2 && one > 0)
                    res += "veinti" + ones[one];
                else {
                    res += tens[tn];
                    if (one > 0) {
                        res += (" y " + ones[one]);
                    }
                }
            }
        }
    
        if (res == "") {
            res = "cero";
        }
        return res.replace("  ", " ");
    }
    
    function pad(num, largo, char) {
        char = char || '0';
        num = num + '';
        return num.length >= largo ? num : new Array(largo - num.length + 1).join(char) + num;
    }
    

    Result:

    num2str(123456789)
    "ciento veintitres millones cuatrocientos cincuenta y seis mil setecientos ochenta y nueve pesos (00/100 M.N.)"
    

提交回复
热议问题