小编典典

JavaScript数字转Words

javascript

我正在尝试将数字转换为英文单词,例如 1234 会变成:“ 1232.4 ”。

我的战术是这样的:

  • 将数字分隔为三,然后finlOutPut从右到左将它们放在Array()上。

  • finlOutPut三位数字的每个组(数组中的每个单元格)转换为一个单词(此triConvert函数的作用)。如果所有三个数字均为零,则将它们转换为"dontAddBigSuffix"

  • 从右到左,添加 千,百万,十亿等 。如果finlOutPut单元格等于"dontAddBigSufix"(因为只有零),则不要添加单词并将单元格设置为" "(无)。

看来效果很好,但是我遇到了一些问题,例如19000000 9 ,转换为:“ 一亿九千万 ”。当有几个零时,它将以某种方式“忘记”最后一个数字。

我做错了什么?错误在哪里?为什么它不能完美运行?

<html>
<头>
<meta http-equiv =“ Content-Type” content =“ text / html; charset = utf-8” />

<script type =“ text / javascript”>
函数update(){
    var bigNumArry = new Array('','千','百万','十亿','兆','四分之一','五亿');

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

    如果(numString =='0'){
        document.getElementById('container')。innerHTML ='零';
        返回;
    }

    如果(numString == 0){
        document.getElementById('container')。innerHTML ='messeg告诉输入数字';
        返回;
    }

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

    //将数字切成三位数的小样,然后将其添加到Arry中
    而(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);
        一世 - ;
        numString = numString.substring(0,numString.length-3);
    }
    finlOutPut.push(numString);
    finlOutPut.reverse();

    //将每个三位数的单词转换为英语单词
    //如果所有数字均为零,则triConvert
    //函数返回字符串“ dontAddBigSufix”
    for(j = 0; j <finlOutPut.length; j ++){
        finlOutPut [j] = triConvert(parseInt(finlOutPut [j]));
    }

    var bigScalCntr = 0; //此int标志着一万亿亿美元... Arry

    对于(b = finlOutPut.length-1; b> = 0; b--){
        如果(finlOutPut [b]!=“ dontAddBigSufix”){
            finlOutPut [b] = finlOutPut [b] + bigNumArry [bigScalCntr] +',';
            bigScalCntr ++;
        }
        其他{
            //将finlOP [b]处的字符串从“ dontAddBigSufix”替换为空字符串。
            finlOutPut [b] ='';
            bigScalCntr ++; //提前柜台  
        }
    }

        //将输出Arry转换为,更可打印的字符串 
        for(n = 0; n <finlOutPut.length; n ++){
            输出+ = finlOutPut [n];
        }

    document.getElementById('container')。innerHTML = output; //打印输出
}

//简单的函数,可将数字转换为1到999的单词
函数triConvert(num){
    varones = new Array('',``一个'',``两个'',``三个'',``四个'',``五个'',``六个'',``七个'',``八个'',``九个'',``十个'',``十一”,“十二”,“十三”,“十四”,“十五”,“十六”,“十七”,“十八”,“十九”);
    var tens = new Array('',``,'二十','三十','四十','五十','六十','七十','八十','九十');
    var一百='一百';
    var output ='';
    var numString = num.toString();

    如果(num == 0){
        返回'dontAddBigSufix';
    }
    // 10,11,12,13,.... 19的情况 
    如果(num <20){
        输出=个[数字];
        返回输出;
    }

    // 100以上
    如果(numString.length == 3){
        输出=个[parseInt(numString.charAt(0))] +百;
        输出+ = tens [parseInt(numString.charAt(1))];
        输出+ =个[parseInt(numString.charAt(2))];
        返回输出;
    }

    输出+ = tens [parseInt(numString.charAt(0))];
    输出+ =个[parseInt(numString.charAt(1))];

    返回输出;
}   
</ script>

</ head>
<身体>

<input type =“ text”
    id =“ number”
    大小=“ 70”
    onkeyup =“ update();”
    / *此代码可防止非数字字母* / 
    onkeydown =“ return(event.ctrlKey || event.altKey 
                    || (47 <event.keyCode && event.keyCode <58 && event.shiftKey == false)
                    || (95 <event.keyCode && event.keyCode <106)
                    || (event.keyCode == 8)|| (event.keyCode == 9)
                    || (event.keyCode> 34 && event.keyCode <40)
                    || (event.keyCode == 46))“ />
                    <br/>
<div id =“ container”>此处打印的数字</ div>
</ body>
</ html>

阅读 333

收藏
2020-04-25

共1个答案

小编典典

当前导零数字时,JavaScript会将3个数字的组解析为八进制数字。当三位数字的组全部为零时,无论基数是八进制还是十进制,结果都是相同的。

但是,当您给JavaScript‘009’(或‘008’)时,这是一个无效的八进制数字,因此您会得到零。

如果您经历了从190,000,001到190,000,010的整个数字集,您将看到JavaScript跳过’…,008’和’…,009’,但是为’…,010’发出‘8’。那就是“尤里卡!”
时刻。

更改:

for (j = 0; j < finlOutPut.length; j++) {
    finlOutPut[j] = triConvert(parseInt(finlOutPut[j]));
}

for (j = 0; j < finlOutPut.length; j++) {
    finlOutPut[j] = triConvert(parseInt(finlOutPut[j],10));
}

代码还在每个非零组之后继续添加逗号,因此我玩了一下,找到了添加逗号的正确位置。

旧:

for (b = finlOutPut.length - 1; b >= 0; b--) {
    if (finlOutPut[b] != "dontAddBigSufix") {
        finlOutPut[b] = finlOutPut[b] + bigNumArry[bigScalCntr] + ' , ';
        bigScalCntr++;
    }
    else {
        //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];
    }

新:

for (b = finlOutPut.length - 1; b >= 0; b--) {
    if (finlOutPut[b] != "dontAddBigSufix") {
        finlOutPut[b] = finlOutPut[b] + bigNumArry[bigScalCntr]; // <<<
        bigScalCntr++;
    }
    else {
        //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 
    var nonzero = false; // <<<
    for(n = 0; n<finlOutPut.length; n++){
        if (finlOutPut[n] != ' ') { // <<<
            if (nonzero) output += ' , '; // <<<
            nonzero = true; // <<<
        } // <<<
        output +=finlOutPut[n];
    }
2020-04-25