Mengapakah kod tersebut menukar nombor '190000009' kepada 'seratus sembilan puluh juta' dan bukannya 'seratus sembilan puluh juta sembilan'?

Barbara Streisand
Lepaskan: 2024-11-21 02:01:13
asal
705 orang telah melayarinya

Why does the code incorrectly convert the number

Nombor JavaScript kepada Perkataan

Soalan:
Saya cuba menukar nombor kepada perkataan Inggeris, seperti sebagai 1234 menjadi "seribu dua ratus tiga puluh empat." Fungsi saya berfungsi dengan baik untuk kebanyakan nombor, tetapi untuk nombor seperti 190000009, ia bertukar kepada "seratus sembilan puluh juta" dengan tidak betul. Bolehkah anda mengenal pasti pepijat dan menerangkan mengapa ia berlaku?

Jawapan:

Kod yang disediakan mengendalikan kebanyakan nombor dengan betul, tetapi ia gagal mengambil kira kehadiran sifar selepas bukan sifar digit. Dalam kes 190000009, apabila menukar kumpulan digit "0000," fungsi triConvert mengembalikan "dontAddBigSuffix" kerana semua sifar hadir. Akibatnya, pemformatan seterusnya melangkau menambah "juta" pada kumpulan itu.

Penyelesaian:

Untuk membetulkannya, kod harus menyemak sama ada digit terakhir bagi kumpulan semasa bukan sifar sebelum menandakan kumpulan sebagai "dontAddBigSuffix." Kod yang diubah suai di bawah membetulkan isu ini:

...
if (num == 0) {
    return 'dontAddBigSufix';
}
else if (numString.charAt(numString.length - 1) == 0) {
    return 'dontAddBigSuffix';
}
...
Salin selepas log masuk

Kod Penuh dengan Pengubahsuaian:

function update(){
    var bigNumArry = new Array('', ' thousand', ' million', ' billion', ' trillion', ' quadrillion', ' quintillion');

    var output = '';
    var numString =   document.getElementById('number').value;
    var finlOutPut = new Array();

    if (numString == '0') {
        document.getElementById('container').innerHTML = 'Zero';
        return;
    }

    if (numString == 0) {
        document.getElementById('container').innerHTML = 'messeg tell to enter numbers';
        return;
    }

    var i = numString.length;
    i = i - 1;

    //cut the number to grups of three digits and add them to the Arry
    while (numString.length > 3) {
        var triDig = new Array(3);
        triDig[2] = numString.charAt(numString.length - 1);
        triDig[1] = numString.charAt(numString.length - 2);
        triDig[0] = numString.charAt(numString.length - 3);

        var varToAdd = triDig[0] + triDig[1] + triDig[2];
        finlOutPut.push(varToAdd);
        i--;
        numString = numString.substring(0, numString.length - 3);
    }
    finlOutPut.push(numString);
    finlOutPut.reverse();

    //conver each grup of three digits to english word
    //if all digits are zero the triConvert
    //function return the string "dontAddBigSufix"
    for (j = 0; j < finlOutPut.length; j++) {
        finlOutPut[j] = triConvert(parseInt(finlOutPut[j]));
    }

    var bigScalCntr = 0; //this int mark the million billion trillion... Arry

    for (b = finlOutPut.length - 1; b >= 0; b--) {
        if (finlOutPut[b] != "dontAddBigSufix") {
            finlOutPut[b] = finlOutPut[b] + bigNumArry[bigScalCntr] + ' , ';
            bigScalCntr++;
        }
        else if (finlOutPut[b] == "dontAddBigSuffix" && finlOutPut[b-1] != "dontAddBigSuffix") {
            //replace the string at finlOP[b] from "dontAddBigSufix" to empty String.
            finlOutPut[b] = ' ';
            bigScalCntr++; //advance the counter  
        }
    }

        //convert The output Arry to , more printable string 
        for(n = 0; n<finlOutPut.length; n++){
            output +=finlOutPut[n];
        }

    document.getElementById('container').innerHTML = output;//print the output
}

//simple function to convert from numbers to words from 1 to 999
function triConvert(num){
    var ones = new Array('', ' one', ' two', ' three', ' four', ' five', ' six', ' seven', ' eight', ' nine', ' ten', ' eleven', ' twelve', ' thirteen', ' fourteen', ' fifteen', ' sixteen', ' seventeen', ' eighteen', ' nineteen');
    var tens = new Array('', '', ' twenty', ' thirty', ' forty', ' fifty', ' sixty', ' seventy', ' eighty', ' ninety');
    var hundred = ' hundred';
    var output = '';
    var numString = num.toString();

    if (num == 0) {
        return 'dontAddBigSufix';
    }
    else if (numString.charAt(numString.length - 1) == 0) {
        return 'dontAddBigSuffix';
    }
    //the case of 10, 11, 12 ,13, .... 19 
    if (num < 20) {
        output = ones[num];
        return output;
    }

    //100 and more
    if (numString.length == 3) {
        output = ones[parseInt(numString.charAt(0))] + hundred;
        output += tens[parseInt(numString.charAt(1))];
        output += ones[parseInt(numString.charAt(2))];
        return output;
    }

    output += tens[parseInt(numString.charAt(0))];
    output += ones[parseInt(numString.charAt(1))];

    return output;
}   
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapakah kod tersebut menukar nombor '190000009' kepada 'seratus sembilan puluh juta' dan bukannya 'seratus sembilan puluh juta sembilan'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan