我正在尝试将数字转换为英文单词,例如 1234 会变成:“ 1232.4 ”。
我的战术是这样的:
将数字分隔为三,然后finlOutPut从右到左将它们放在Array()上。
finlOutPut
将finlOutPut三位数字的每个组(数组中的每个单元格)转换为一个单词(此triConvert函数的作用)。如果所有三个数字均为零,则将它们转换为"dontAddBigSuffix"
triConvert
"dontAddBigSuffix"
从右到左,添加 千,百万,十亿等 。如果finlOutPut单元格等于"dontAddBigSufix"(因为只有零),则不要添加单词并将单元格设置为" "(无)。
"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>
当前导零数字时,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]; }