用JavaScript将数字转换成单词

我正在编写一个代码,将给定的量转换为文字,这是我在Google上search得到的结果。 但是我认为它有一点冗长的代码来完成一个简单的任务。 两个正则expression式和两个for循环,我想要更简单一些。

我试图尽可能缩短。 并将张贴我想出的东西

有什么build议么?

 var th = ['','thousand','million', 'billion','trillion']; var dg = ['zero','one','two','three','four', 'five','six','seven','eight','nine']; var tn = ['ten','eleven','twelve','thirteen', 'fourteen','fifteen','sixteen', 'seventeen','eighteen','nineteen']; var tw = ['twenty','thirty','forty','fifty', 'sixty','seventy','eighty','ninety']; function toWords(s) { s = s.toString(); s = s.replace(/[\, ]/g,''); if (s != parseFloat(s)) return 'not a number'; var x = s.indexOf('.'); if (x == -1) x = s.length; if (x > 15) return 'too big'; var n = s.split(''); var str = ''; var sk = 0; for (var i=0; i < x; i++) { if ((xi)%3==2) { if (n[i] == '1') { str += tn[Number(n[i+1])] + ' '; i++; sk=1; } else if (n[i]!=0) { str += tw[n[i]-2] + ' '; sk=1; } } else if (n[i]!=0) { // 0235 str += dg[n[i]] +' '; if ((xi)%3==0) str += 'hundred '; sk=1; } if ((xi)%3==1) { if (sk) str += th[(xi-1)/3] + ' '; sk=0; } } if (x != s.length) { var y = s.length; str += 'point '; for (var i=x+1; i<y; i++) str += dg[n[i]] +' '; } return str.replace(/\s+/g,' '); } 

此外,上述代码转换为英文数字系统百万/亿,我不想南亚编号系统。 就像在Lakhs和Crores一样

这是一个较短的代码。 一个正则expression式,没有循环。 在南亚编号系统中按你想要的转换

 var a = ['','one ','two ','three ','four ', 'five ','six ','seven ','eight ','nine ','ten ','eleven ','twelve ','thirteen ','fourteen ','fifteen ','sixteen ','seventeen ','eighteen ','nineteen ']; var b = ['', '', 'twenty','thirty','forty','fifty', 'sixty','seventy','eighty','ninety']; function inWords (num) { if ((num = num.toString()).length > 9) return 'overflow'; n = ('000000000' + num).substr(-9).match(/^(\d{2})(\d{2})(\d{2})(\d{1})(\d{2})$/); if (!n) return; var str = ''; str += (n[1] != 0) ? (a[Number(n[1])] || b[n[1][0]] + ' ' + a[n[1][1]]) + 'crore ' : ''; str += (n[2] != 0) ? (a[Number(n[2])] || b[n[2][0]] + ' ' + a[n[2][1]]) + 'lakh ' : ''; str += (n[3] != 0) ? (a[Number(n[3])] || b[n[3][0]] + ' ' + a[n[3][1]]) + 'thousand ' : ''; str += (n[4] != 0) ? (a[Number(n[4])] || b[n[4][0]] + ' ' + a[n[4][1]]) + 'hundred ' : ''; str += (n[5] != 0) ? ((str != '') ? 'and ' : '') + (a[Number(n[5])] || b[n[5][0]] + ' ' + a[n[5][1]]) + 'only ' : ''; return str; } 

唯一的限制是,你可以转换最多9位数,我认为在大多数情况下绰绰有余。

“简单的任务。” – Potatoswatter

确实。 在这个问题的细节上,有许多小恶魔在悬崖勒马。 解决这个问题非常有趣。

编辑:这个更新需要更多的组合方法。 以前有一个大function包装了一些其他的专有function。 相反,这次我们定义了可用于多种任务的通用可重用函数。 更多关于这些之后,我们看看numToWords本身…

 // numToWords :: (Number a, String a) => a -> String let numToWords = n => { let a = [ '', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen' ]; let b = [ '', '', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety' ]; let g = [ '', 'thousand', 'million', 'billion', 'trillion', 'quadrillion', 'quintillion', 'sextillion', 'septillion', 'octillion', 'nonillion' ]; // this part is really nasty still // it might edit this again later to show how Monoids could fix this up let makeGroup = ([ones,tens,huns]) => { return [ num(huns) === 0 ? '' : a[huns] + ' hundred ', num(ones) === 0 ? b[tens] : b[tens] && b[tens] + '-' || '', a[tens+ones] || a[ones] ].join(''); }; // "thousands" constructor; no real good names for this, i guess let thousand = (group,i) => group === '' ? group : `${group} ${g[i]}`; // execute ! if (typeof n === 'number') return numToWords(String(n)); if (n === '0') return 'zero'; return comp (chunk(3)) (reverse) (arr(n)) .map(makeGroup) .map(thousand) .filter(comp(not)(isEmpty)) .reverse() .join(' '); }; 

这里是依赖关系:

你会注意到这些需要旁边没有文件,因为他们的意图立即清晰。 chunk可能是唯一需要一点时间才能消化的,但它确实不错。 再加上函数名称给了我们很好的指示,它可能是我们以前遇到过的一个函数。

 const arr = x => Array.from(x); const num = x => Number(x) || 0; const str = x => String(x); const isEmpty = xs => xs.length === 0; const take = n => xs => xs.slice(0,n); const drop = n => xs => xs.slice(n); const reverse = xs => xs.slice(0).reverse(); const comp = f => g => x => f (g (x)); const not = x => !x; const chunk = n => xs => isEmpty(xs) ? [] : [take(n)(xs), ...chunk (n) (drop (n) (xs))]; 

“所以这些做得更好?”

看看代码是如何清理的

 // NEW CODE (truncated) return comp (chunk(3)) (reverse) (arr(n)) .map(makeGroup) .map(thousand) .filter(comp(not)(isEmpty)) .reverse() .join(' '); // OLD CODE (truncated) let grp = n => ('000' + n).substr(-3); let rem = n => n.substr(0, n.length - 3); let cons = xs => x => g => x ? [x, g && ' ' + g || '', ' ', xs].join('') : xs; let iter = str => i => x => r => { if (x === '000' && r.length === 0) return str; return iter(cons(str)(fmt(x))(g[i])) (i+1) (grp(r)) (rem(r)); }; return iter('')(0)(grp(String(n)))(rem(String(n))); 

最重要的是,我们在新代码中添加的实用程序function可以在您的应用程序的其他地方使用。 这意味着,作为以这种方式实现numToWords一个副作用,我们可以免费获得其他函数。 奖金苏打水!

一些testing

 console.log(numToWords(11009)); //=> eleven thousand nine console.log(numToWords(10000001)); //=> ten million one console.log(numToWords(987)); //=> nine hundred eighty-seven console.log(numToWords(1015)); //=> one thousand fifteen console.log(numToWords(55111222333)); //=> fifty-five billion one hundred eleven million two hundred // twenty-two thousand three hundred thirty-three console.log(numToWords("999999999999999999999991")); //=> nine hundred ninety-nine sextillion nine hundred ninety-nine // quintillion nine hundred ninety-nine quadrillion nine hundred // ninety-nine trillion nine hundred ninety-nine billion nine // hundred ninety-nine million nine hundred ninety-nine thousand // nine hundred ninety-one console.log(numToWords(6000753512)); //=> six billion seven hundred fifty-three thousand five hundred // twelve 

可运行的演示

 const arr = x => Array.from(x); const num = x => Number(x) || 0; const str = x => String(x); const isEmpty = xs => xs.length === 0; const take = n => xs => xs.slice(0,n); const drop = n => xs => xs.slice(n); const reverse = xs => xs.slice(0).reverse(); const comp = f => g => x => f (g (x)); const not = x => !x; const chunk = n => xs => isEmpty(xs) ? [] : [take(n)(xs), ...chunk (n) (drop (n) (xs))]; // numToWords :: (Number a, String a) => a -> String let numToWords = n => { let a = [ '', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen' ]; let b = [ '', '', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety' ]; let g = [ '', 'thousand', 'million', 'billion', 'trillion', 'quadrillion', 'quintillion', 'sextillion', 'septillion', 'octillion', 'nonillion' ]; // this part is really nasty still // it might edit this again later to show how Monoids could fix this up let makeGroup = ([ones,tens,huns]) => { return [ num(huns) === 0 ? '' : a[huns] + ' hundred ', num(ones) === 0 ? b[tens] : b[tens] && b[tens] + '-' || '', a[tens+ones] || a[ones] ].join(''); }; let thousand = (group,i) => group === '' ? group : `${group} ${g[i]}`; if (typeof n === 'number') return numToWords(String(n)); else if (n === '0') return 'zero'; else return comp (chunk(3)) (reverse) (arr(n)) .map(makeGroup) .map(thousand) .filter(comp(not)(isEmpty)) .reverse() .join(' '); }; console.log(numToWords(11009)); //=> eleven thousand nine console.log(numToWords(10000001)); //=> ten million one console.log(numToWords(987)); //=> nine hundred eighty-seven console.log(numToWords(1015)); //=> one thousand fifteen console.log(numToWords(55111222333)); //=> fifty-five billion one hundred eleven million two hundred // twenty-two thousand three hundred thirty-three console.log(numToWords("999999999999999999999991")); //=> nine hundred ninety-nine sextillion nine hundred ninety-nine // quintillion nine hundred ninety-nine quadrillion nine hundred // ninety-nine trillion nine hundred ninety-nine billion nine // hundred ninety-nine million nine hundred ninety-nine thousand // nine hundred ninety-one console.log(numToWords(6000753512)); //=> six billion seven hundred fifty-three thousand five hundred // twelve 

我花了一段时间来开发一个更好的解决scheme。 它可以处理非常大的数字,但一旦他们超过16位数字,你已经作为一个string传递的数字。 关于JavaScript数字的限制。

 function numberToEnglish( n ) { var string = n.toString(), units, tens, scales, start, end, chunks, chunksLen, chunk, ints, i, word, words, and = 'and'; /* Is number zero? */ if( parseInt( string ) === 0 ) { return 'zero'; } /* Array of units as words */ units = [ '', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen' ]; /* Array of tens as words */ tens = [ '', '', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety' ]; /* Array of scales as words */ scales = [ '', 'thousand', 'million', 'billion', 'trillion', 'quadrillion', 'quintillion', 'sextillion', 'septillion', 'octillion', 'nonillion', 'decillion', 'undecillion', 'duodecillion', 'tredecillion', 'quatttuor-decillion', 'quindecillion', 'sexdecillion', 'septen-decillion', 'octodecillion', 'novemdecillion', 'vigintillion', 'centillion' ]; /* Split user arguemnt into 3 digit chunks from right to left */ start = string.length; chunks = []; while( start > 0 ) { end = start; chunks.push( string.slice( ( start = Math.max( 0, start - 3 ) ), end ) ); } /* Check if function has enough scale words to be able to stringify the user argument */ chunksLen = chunks.length; if( chunksLen > scales.length ) { return ''; } /* Stringify each integer in each chunk */ words = []; for( i = 0; i < chunksLen; i++ ) { chunk = parseInt( chunks[i] ); if( chunk ) { /* Split chunk into array of individual integers */ ints = chunks[i].split( '' ).reverse().map( parseFloat ); /* If tens integer is 1, ie 10, then add 10 to units integer */ if( ints[1] === 1 ) { ints[0] += 10; } /* Add scale word if chunk is not zero and array item exists */ if( ( word = scales[i] ) ) { words.push( word ); } /* Add unit word if array item exists */ if( ( word = units[ ints[0] ] ) ) { words.push( word ); } /* Add tens word if array item exists */ if( ( word = tens[ ints[1] ] ) ) { words.push( word ); } /* Add 'and' string after units or tens integer if: */ if( ints[0] || ints[1] ) { /* Chunk has a hundreds integer or chunk is the first of multiple chunks */ if( ints[2] || ! i && chunksLen ) { words.push( and ); } } /* Add hundreds word if array item exists */ if( ( word = units[ ints[2] ] ) ) { words.push( word + ' hundred' ); } } } return words.reverse().join( ' ' ); } 

你可能想要尝试recursion。 它适用于0到999999之间的数字。请记住(~~)和Math.floor一样

 var num = "zero one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen".split(" "); var tens = "twenty thirty forty fifty sixty seventy eighty ninety".split(" "); function number2words(n){ if (n < 20) return num[n]; var digit = n%10; if (n < 100) return tens[~~(n/10)-2] + (digit? "-" + num[digit]: ""); if (n < 1000) return num[~~(n/100)] +" hundred" + (n%100 == 0? "": " " + number2words(n%100)); return number2words(~~(n/1000)) + " thousand" + (n%1000 != 0? " " + number2words(n%1000): ""); } 

在这里输入图像描述

  <html> <head> <title>HTML - Convert numbers to words using JavaScript</title> <script type="text/javascript"> function onlyNumbers(evt) { var e = event || evt; // For trans-browser compatibility var charCode = e.which || e.keyCode; if (charCode > 31 && (charCode < 48 || charCode > 57)) return false; return true; } function NumToWord(inputNumber, outputControl) { var str = new String(inputNumber) var splt = str.split(""); var rev = splt.reverse(); var once = ['Zero', ' One', ' Two', ' Three', ' Four', ' Five', ' Six', ' Seven', ' Eight', ' Nine']; var twos = ['Ten', ' Eleven', ' Twelve', ' Thirteen', ' Fourteen', ' Fifteen', ' Sixteen', ' Seventeen', ' Eighteen', ' Nineteen']; var tens = ['', 'Ten', ' Twenty', ' Thirty', ' Forty', ' Fifty', ' Sixty', ' Seventy', ' Eighty', ' Ninety']; numLength = rev.length; var word = new Array(); var j = 0; for (i = 0; i < numLength; i++) { switch (i) { case 0: if ((rev[i] == 0) || (rev[i + 1] == 1)) { word[j] = ''; } else { word[j] = '' + once[rev[i]]; } word[j] = word[j]; break; case 1: aboveTens(); break; case 2: if (rev[i] == 0) { word[j] = ''; } else if ((rev[i - 1] == 0) || (rev[i - 2] == 0)) { word[j] = once[rev[i]] + " Hundred "; } else { word[j] = once[rev[i]] + " Hundred and"; } break; case 3: if (rev[i] == 0 || rev[i + 1] == 1) { word[j] = ''; } else { word[j] = once[rev[i]]; } if ((rev[i + 1] != 0) || (rev[i] > 0)) { word[j] = word[j] + " Thousand"; } break; case 4: aboveTens(); break; case 5: if ((rev[i] == 0) || (rev[i + 1] == 1)) { word[j] = ''; } else { word[j] = once[rev[i]]; } if (rev[i + 1] !== '0' || rev[i] > '0') { word[j] = word[j] + " Lakh"; } break; case 6: aboveTens(); break; case 7: if ((rev[i] == 0) || (rev[i + 1] == 1)) { word[j] = ''; } else { word[j] = once[rev[i]]; } if (rev[i + 1] !== '0' || rev[i] > '0') { word[j] = word[j] + " Crore"; } break; case 8: aboveTens(); break; // This is optional. // case 9: // if ((rev[i] == 0) || (rev[i + 1] == 1)) { // word[j] = ''; // } // else { // word[j] = once[rev[i]]; // } // if (rev[i + 1] !== '0' || rev[i] > '0') { // word[j] = word[j] + " Arab"; // } // break; // case 10: // aboveTens(); // break; default: break; } j++; } function aboveTens() { if (rev[i] == 0) { word[j] = ''; } else if (rev[i] == 1) { word[j] = twos[rev[i - 1]]; } else { word[j] = tens[rev[i]]; } } word.reverse(); var finalOutput = ''; for (i = 0; i < numLength; i++) { finalOutput = finalOutput + word[i]; } document.getElementById(outputControl).innerHTML = finalOutput; } </script> </head> <body> <h1> HTML - Convert numbers to words using JavaScript</h1> <input id="Text1" type="text" onkeypress="return onlyNumbers(this.value);" onkeyup="NumToWord(this.value,'divDisplayWords');" maxlength="9" style="background-color: #efefef; border: 2px solid #CCCCC; font-size: large" /> <br /> <br /> <div id="divDisplayWords" style="font-size: 13; color: Teal; font-family: Arial;"> </div> </body> </html> 

将inputstring转换为数字而不是将其保留为string,将解决scheme限制为该机器/浏览器上允许的最大浮点/整数值。 我的脚本下面处理货币高达1万亿美元 – 1美分:-)。 我可以通过添加3或4行代码来扩展处理多达999个万亿次。

 var ones = ["","One","Two","Three","Four","Five","Six","Seven","Eight", "Nine","Ten","Eleven","Twelve","Thirteen","Fourteen", "Fifteen","Sixteen","Seventeen","Eighteen","Nineteen"]; var tens = ["","","Twenty","Thirty","Forty","Fifty","Sixty","Seventy", "Eighty","Ninety"]; function words999(n999) { // n999 is an integer less than or equal to 999. // // Accept any 3 digit int incl 000 & 999 and return words. // var words = ''; var Hn = 0; var n99 = 0; Hn = Math.floor(n999 / 100); // # of hundreds in it if (Hn > 0) { // if at least one 100 words = words99(Hn) + " Hundred"; // one call for hundreds } n99 = n999 - (Hn * 100); // subtract the hundreds. words += ((words == '')?'':' ') + words99(n99); // combine the hundreds with tens & ones. return words; } // function words999( n999 ) function words99(n99) { // n99 is an integer less than or equal to 99. // // Accept any 2 digit int incl 00 & 99 and return words. // var words = ''; var Dn = 0; var Un = 0; Dn = Math.floor(n99 / 10); // # of tens Un = n99 % 10; // units if (Dn > 0 || Un > 0) { if (Dn < 2) { words += ones[Dn * 10 + Un]; // words for a # < 20 } else { words += tens[Dn]; if (Un > 0) words += "-" + ones[Un]; } } // if ( Dn > 0 || Un > 0 ) return words; } // function words99( n99 ) function getAmtInWords(id1, id2) { // use numeric value of id1 to populate text in id2 // // Read numeric amount field and convert into word amount // var t1 = document.getElementById(id1).value; var t2 = t1.trim(); amtStr = t2.replace(/,/g,''); // $123,456,789.12 = 123456789.12 dotPos = amtStr.indexOf('.'); // position of dot before cents, -ve if it doesn't exist. if (dotPos > 0) { dollars = amtStr.slice(0,dotPos); // 1234.56 = 1234 cents = amtStr.slice(dotPos+1); // 1234.56 = .56 } else if (dotPos == 0) { dollars = '0'; cents = amtStr.slice(dotPos+1); // 1234.56 = .56 } else { dollars = amtStr.slice(0); // 1234 = 1234 cents = '0'; } t1 = '000000000000' + dollars; // to extend to trillion, use 15 zeros dollars = t1.slice(-12); // and -15 here. billions = Number(dollars.substr(0,3)); millions = Number(dollars.substr(3,3)); thousands = Number(dollars.substr(6,3)); hundreds = Number(dollars.substr(9,3)); t1 = words999(billions); bW = t1.trim(); // Billions in words t1 = words999(millions); mW = t1.trim(); // Millions in words t1 = words999(thousands); tW = t1.trim(); // Thousands in words t1 = words999(hundreds); hW = t1.trim(); // Hundreds in words t1 = words99(cents); cW = t1.trim(); // Cents in words var totAmt = ''; if (bW != '') totAmt += ((totAmt != '') ? ' ' : '') + bW + ' Billion'; if (mW != '') totAmt += ((totAmt != '') ? ' ' : '') + mW + ' Million'; if (tW != '') totAmt += ((totAmt != '') ? ' ' : '') + tW + ' Thousand'; if (hW != '') totAmt += ((totAmt != '') ? ' ' : '') + hW + ' Dollars'; if (cW != '') totAmt += ((totAmt != '') ? ' and ' : '') + cW + ' Cents'; // alert('totAmt = ' + totAmt); // display words in a alert t1 = document.getElementById(id2).value; t2 = t1.trim(); if (t2 == '') document.getElementById(id2).value = totAmt; return false; } // function getAmtInWords( id1, id2 ) // ======================== [ End Code ] ==================================== 

这是对@ LordZardeck对@ naomik上面的出色答案的评论。 对不起,我会直接评论,但我从来没有发表过,所以我没有特权这样做,所以我张贴在这里,而不是。

无论如何,我恰好在上个周末将ES5版本翻译成更易读的forms,所以我在这里分享它。 这应该是忠实于原文(包括最近的编辑),我希望命名清晰准确。

 function int_to_words(int) { if (int === 0) return 'zero'; var ONES = ['','one','two','three','four','five','six','seven','eight','nine','ten','eleven','twelve','thirteen','fourteen','fifteen','sixteen','seventeen','eighteen','nineteen']; var TENS = ['','','twenty','thirty','fourty','fifty','sixty','seventy','eighty','ninety']; var SCALE = ['','thousand','million','billion','trillion','quadrillion','quintillion','sextillion','septillion','octillion','nonillion']; // Return string of first three digits, padded with zeros if needed function get_first(str) { return ('000' + str).substr(-3); } // Return string of digits with first three digits chopped off function get_rest(str) { return str.substr(0, str.length - 3); } // Return string of triplet convereted to words function triplet_to_words(_3rd, _2nd, _1st) { return (_3rd == '0' ? '' : ONES[_3rd] + ' hundred ') + (_1st == '0' ? TENS[_2nd] : TENS[_2nd] && TENS[_2nd] + '-' || '') + (ONES[_2nd + _1st] || ONES[_1st]); } // Add to words, triplet words with scale word function add_to_words(words, triplet_words, scale_word) { return triplet_words ? triplet_words + (scale_word && ' ' + scale_word || '') + ' ' + words : words; } function iter(words, i, first, rest) { if (first == '000' && rest.length === 0) return words; return iter(add_to_words(words, triplet_to_words(first[0], first[1], first[2]), SCALE[i]), ++i, get_first(rest), get_rest(rest)); } return iter('', 0, get_first(String(int)), get_rest(String(int))); } 
 var inWords = function(totalRent){ //console.log(totalRent); var a = ['','one ','two ','three ','four ', 'five ','six ','seven ','eight ','nine ','ten ','eleven ','twelve ','thirteen ','fourteen ','fifteen ','sixteen ','seventeen ','eighteen ','nineteen ']; var b = ['', '', 'twenty','thirty','forty','fifty', 'sixty','seventy','eighty','ninety']; var number = parseFloat(totalRent).toFixed(2).split("."); var num = parseInt(number[0]); var digit = parseInt(number[1]); //console.log(num); if ((num.toString()).length > 9) return 'overflow'; var n = ('000000000' + num).substr(-9).match(/^(\d{2})(\d{2})(\d{2})(\d{1})(\d{2})$/); var d = ('00' + digit).substr(-2).match(/^(\d{2})$/);; if (!n) return; var str = ''; str += (n[1] != 0) ? (a[Number(n[1])] || b[n[1][0]] + ' ' + a[n[1][1]]) + 'crore ' : ''; str += (n[2] != 0) ? (a[Number(n[2])] || b[n[2][0]] + ' ' + a[n[2][1]]) + 'lakh ' : ''; str += (n[3] != 0) ? (a[Number(n[3])] || b[n[3][0]] + ' ' + a[n[3][1]]) + 'thousand ' : ''; str += (n[4] != 0) ? (a[Number(n[4])] || b[n[4][0]] + ' ' + a[n[4][1]]) + 'hundred ' : ''; str += (n[5] != 0) ? (a[Number(n[5])] || b[n[5][0]] + ' ' + a[n[5][1]]) + 'Rupee ' : ''; str += (d[1] != 0) ? ((str != '' ) ? "and " : '') + (a[Number(d[1])] || b[d[1][0]] + ' ' + a[d[1][1]]) + 'Paise ' : 'Only!'; console.log(str); return str; } 

这是修改的代码支持2位小数的印度卢比。

我修改@ McShaman的代码,将其转换为CoffeeScript,并通过JSNice添加文档。 对于那些感兴趣的人来说,结果如下(英文):

 ### Convert an integer to an English string equivalent @param {Integer} number the integer to be converted @return {String} the English number equivalent ### inWords = (number) -> ### @property {Array} ### englishIntegers = [ "" "one " "two " "three " "four " "five " "six " "seven " "eight " "nine " "ten " "eleven " "twelve " "thirteen " "fourteen " "fifteen " "sixteen " "seventeen " "eighteen " "nineteen " ] ### @property {Array} ### englishIntegerTens = [ "" "" "twenty" "thirty" "forty" "fifty" "sixty" "seventy" "eighty" "ninety" ] ### @property {Array} ### englishIntegerThousands = [ "thousand" "million" "" ] number = number.toString() return "" if number.length > 9 ### @property {string} ### number = ("000000000" + number).substr(-9) ### @property {(Array.<string>|null)} ### number = number.match(/.{3}/g) ### @property {string} ### convertedWords = "" ### @property {number} ### i = 0 while i < englishIntegerThousands.length ### @property {string} ### currentNumber = number[i] ### @property {string} ### tempResult = "" tempResult += (if convertedWords isnt "" then " " + englishIntegerThousands[i] + " " else "") tempResult += (if currentNumber[0] isnt 0 then englishIntegers[Number(currentNumber[0])] + "hundred " else "") ### @property {string} ### currentNumber = currentNumber.substr(1) tempResult += (if currentNumber isnt 0 then ((if tempResult isnt "" then "and " else "")) + (englishIntegers[Number(currentNumber)] or englishIntegerTens[currentNumber[0]] + " " + englishIntegers[currentNumber[1]]) else "") convertedWords += tempResult i++ convertedWords 

虽然这个问题已经得到了解答,但我仍然想分享一下我最近在java脚本中开发的一些东西(基于我在Internet上发现的一个旧的C#.Net实现的逻辑),用于将印度货币值转换为Words。 它最多可以处理40位数字。 你可以看看。

用法:InrToWordConverter.Initialize();. var inWords = InrToWordConverter.ConvertToWord(amount);

执行:

 htPunctuation = {}; listStaticSuffix = {}; listStaticPrefix = {}; listHelpNotation = {}; var InrToWordConverter = function () { }; InrToWordConverter.Initialize = function () { InrToWordConverter.LoadStaticPrefix(); InrToWordConverter.LoadStaticSuffix(); InrToWordConverter.LoadHelpofNotation(); }; InrToWordConverter.ConvertToWord = function (value) { value = value.toString(); if (value) { var tokens = value.split("."); var rsPart = ""; var psPart = ""; if (tokens.length === 2) { rsPart = String.trim(tokens[0]) || "0"; psPart = String.trim(tokens[1]) || "0"; } else if (tokens.length === 1) { rsPart = String.trim(tokens[0]) || "0"; psPart = "0"; } else { rsPart = "0"; psPart = "0"; } htPunctuation = {}; var rsInWords = InrToWordConverter.ConvertToWordInternal(rsPart) || "Zero"; var psInWords = InrToWordConverter.ConvertToWordInternal(psPart) || "Zero"; var result = "Rupees " + rsInWords + "and " + psInWords + " Paise."; return result; } }; InrToWordConverter.ConvertToWordInternal = function (value) { var convertedString = ""; if (!(value.toString().length > 40)) { if (InrToWordConverter.IsNumeric(value.toString())) { try { var strValue = InrToWordConverter.Reverse(value); switch (strValue.length) { case 1: if (parseInt(strValue.toString()) > 0) { convertedString = InrToWordConverter.GetWordConversion(value); } else { convertedString = "Zero "; } break; case 2: convertedString = InrToWordConverter.GetWordConversion(value); break; default: InrToWordConverter.InsertToPunctuationTable(strValue); InrToWordConverter.ReverseHashTable(); convertedString = InrToWordConverter.ReturnHashtableValue(); break; } } catch (exception) { convertedString = "Unexpected Error Occured <br/>"; } } else { convertedString = "Please Enter Numbers Only, Decimal Values Are not supported"; } } else { convertedString = "Please Enter Value in Less Then or Equal to 40 Digit"; } return convertedString; }; InrToWordConverter.IsNumeric = function (valueInNumeric) { var isFine = true; valueInNumeric = valueInNumeric || ""; var len = valueInNumeric.length; for (var i = 0; i < len; i++) { var ch = valueInNumeric[i]; if (!(ch >= '0' && ch <= '9')) { isFine = false; break; } } return isFine; }; InrToWordConverter.ReturnHashtableValue = function () { var strFinalString = ""; var keysArr = []; for (var key in htPunctuation) { keysArr.push(key); } for (var i = keysArr.length - 1; i >= 0; i--) { var hKey = keysArr[i]; if (InrToWordConverter.GetWordConversion((htPunctuation[hKey]).toString()) !== "") { strFinalString = strFinalString + InrToWordConverter.GetWordConversion((htPunctuation[hKey]).toString()) + InrToWordConverter.StaticPrefixFind((hKey).toString()); } } return strFinalString; }; InrToWordConverter.ReverseHashTable = function () { var htTemp = {}; for (var key in htPunctuation) { var item = htPunctuation[key]; htTemp[key] = InrToWordConverter.Reverse(item.toString()); } htPunctuation = {}; htPunctuation = htTemp; }; InrToWordConverter.InsertToPunctuationTable = function (strValue) { htPunctuation[1] = strValue.substr(0, 3).toString(); var j = 2; for (var i = 3; i < strValue.length; i = i + 2) { if (strValue.substr(i).length > 0) { if (strValue.substr(i).length >= 2) { htPunctuation[j] = strValue.substr(i, 2).toString(); } else { htPunctuation[j] = strValue.substr(i, 1).toString(); } } else { break; } j++; } }; InrToWordConverter.Reverse = function (strValue) { var reversed = ""; for (var i in strValue) { var ch = strValue[i]; reversed = ch + reversed; } return reversed; }; InrToWordConverter.GetWordConversion = function (inputNumber) { var toReturnWord = ""; if (inputNumber.length <= 3 && inputNumber.length > 0) { if (inputNumber.length === 3) { if (parseInt(inputNumber.substr(0, 1)) > 0) { toReturnWord = toReturnWord + InrToWordConverter.StaticSuffixFind(inputNumber.substr(0, 1)) + "Hundred "; } var tempString = InrToWordConverter.StaticSuffixFind(inputNumber.substr(1, 2)); if (tempString === "") { toReturnWord = toReturnWord + InrToWordConverter.StaticSuffixFind(inputNumber.substr(1, 1) + "0"); toReturnWord = toReturnWord + InrToWordConverter.StaticSuffixFind(inputNumber.substr(2, 1)); } toReturnWord = toReturnWord + tempString; } if (inputNumber.length === 2) { var tempString = InrToWordConverter.StaticSuffixFind(inputNumber.substr(0, 2)); if (tempString === "") { toReturnWord = toReturnWord + InrToWordConverter.StaticSuffixFind(inputNumber.substr(0, 1) + "0"); toReturnWord = toReturnWord + InrToWordConverter.StaticSuffixFind(inputNumber.substr(1, 1)); } toReturnWord = toReturnWord + tempString; } if (inputNumber.length === 1) { toReturnWord = toReturnWord + InrToWordConverter.StaticSuffixFind(inputNumber.substr(0, 1)); } } return toReturnWord; }; InrToWordConverter.StaticSuffixFind = function (numberKey) { var valueFromNumber = ""; for (var key in listStaticSuffix) { if (String.trim(key.toString()) === String.trim(numberKey)) { valueFromNumber = listStaticSuffix[key].toString(); break; } } return valueFromNumber; }; InrToWordConverter.StaticPrefixFind = function (numberKey) { var valueFromNumber = ""; for (var key in listStaticPrefix) { if (String.trim(key) === String.trim(numberKey)) { valueFromNumber = listStaticPrefix[key].toString(); break; } } return valueFromNumber; }; InrToWordConverter.StaticHelpNotationFind = function (numberKey) { var helpText = ""; for (var key in listHelpNotation) { if (String.trim(key.toString()) === String.trim(numberKey)) { helpText = listHelpNotation[key].toString(); break; } } return helpText; }; InrToWordConverter.LoadStaticPrefix = function () { listStaticPrefix[2] = "Thousand "; listStaticPrefix[3] = "Lac "; listStaticPrefix[4] = "Crore "; listStaticPrefix[5] = "Arab "; listStaticPrefix[6] = "Kharab "; listStaticPrefix[7] = "Neel "; listStaticPrefix[8] = "Padma "; listStaticPrefix[9] = "Shankh "; listStaticPrefix[10] = "Maha-shankh "; listStaticPrefix[11] = "Ank "; listStaticPrefix[12] = "Jald "; listStaticPrefix[13] = "Madh "; listStaticPrefix[14] = "Paraardha "; listStaticPrefix[15] = "Ant "; listStaticPrefix[16] = "Maha-ant "; listStaticPrefix[17] = "Shisht "; listStaticPrefix[18] = "Singhar "; listStaticPrefix[19] = "Maha-singhar "; listStaticPrefix[20] = "Adant-singhar "; }; InrToWordConverter.LoadStaticSuffix = function () { listStaticSuffix[1] = "One "; listStaticSuffix[2] = "Two "; listStaticSuffix[3] = "Three "; listStaticSuffix[4] = "Four "; listStaticSuffix[5] = "Five "; listStaticSuffix[6] = "Six "; listStaticSuffix[7] = "Seven "; listStaticSuffix[8] = "Eight "; listStaticSuffix[9] = "Nine "; listStaticSuffix[10] = "Ten "; listStaticSuffix[11] = "Eleven "; listStaticSuffix[12] = "Twelve "; listStaticSuffix[13] = "Thirteen "; listStaticSuffix[14] = "Fourteen "; listStaticSuffix[15] = "Fifteen "; listStaticSuffix[16] = "Sixteen "; listStaticSuffix[17] = "Seventeen "; listStaticSuffix[18] = "Eighteen "; listStaticSuffix[19] = "Nineteen "; listStaticSuffix[20] = "Twenty "; listStaticSuffix[30] = "Thirty "; listStaticSuffix[40] = "Fourty "; listStaticSuffix[50] = "Fifty "; listStaticSuffix[60] = "Sixty "; listStaticSuffix[70] = "Seventy "; listStaticSuffix[80] = "Eighty "; listStaticSuffix[90] = "Ninty "; }; InrToWordConverter.LoadHelpofNotation = function () { listHelpNotation[2] = "=1,000 (3 Trailing Zeros)"; listHelpNotation[3] = "=1,00,000 (5 Trailing Zeros)"; listHelpNotation[4] = "=1,00,00,000 (7 Trailing Zeros)"; listHelpNotation[5] = "=1,00,00,00,000 (9 Trailing Zeros)"; listHelpNotation[6] = "=1,00,00,00,00,000 (11 Trailing Zeros)"; listHelpNotation[7] = "=1,00,00,00,00,00,000 (13 Trailing Zeros)"; listHelpNotation[8] = "=1,00,00,00,00,00,00,000 (15 Trailing Zeros)"; listHelpNotation[9] = "=1,00,00,00,00,00,00,00,000 (17 Trailing Zeros)"; listHelpNotation[10] = "=1,00,00,00,00,00,00,00,00,000 (19 Trailing Zeros)"; listHelpNotation[11] = "=1,00,00,00,00,00,00,00,00,00,000 (21 Trailing Zeros)"; listHelpNotation[12] = "=1,00,00,00,00,00,00,00,00,00,00,000 (23 Trailing Zeros)"; listHelpNotation[13] = "=1,00,00,00,00,00,00,00,00,00,00,00,000 (25 Trailing Zeros)"; listHelpNotation[14] = "=1,00,00,00,00,00,00,00,00,00,00,00,00,000 (27 Trailing Zeros)"; listHelpNotation[15] = "=1,00,00,00,00,00,00,00,00,00,00,00,00,00,000 (29 Trailing Zeros)"; listHelpNotation[16] = "=1,00,00,00,00,00,00,00,00,00,00,00,00,00,00,000 (31 Trailing Zeros)"; listHelpNotation[17] = "=1,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,000 (33 Trailing Zeros)"; listHelpNotation[18] = "=1,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,000 (35 Trailing Zeros)"; listHelpNotation[19] = "=1,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,000 (37 Trailing Zeros)"; listHelpNotation[20] = "=1,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,000 (39 Trailing Zeros)"; }; if (!String.trim) { String.trim = function (str) { var result = ""; var firstNonWhiteSpaceFound = false; var startIndex = -1; var endIndex = -1; if (str) { for (var i = 0; i < str.length; i++) { if (firstNonWhiteSpaceFound === false) { if (str[i] === ' ' || str[i] === '\t') { continue; } else { firstNonWhiteSpaceFound = true; startIndex = i; endIndex = i; } } else { if (str[i] === ' ' || str[i] === '\t') { continue; } else { endIndex = i; } } } if (startIndex !== -1 && endIndex !== -1) { result = str.slice(startIndex, endIndex + 1); } } return result; }; } 

Below are the translations from

  • integer to word
  • float to word
  • money to word

Test cases are at the bottom

 var ONE_THOUSAND = Math.pow(10, 3); var ONE_MILLION = Math.pow(10, 6); var ONE_BILLION = Math.pow(10, 9); var ONE_TRILLION = Math.pow(10, 12); var ONE_QUADRILLION = Math.pow(10, 15); var ONE_QUINTILLION = Math.pow(10, 18); function integerToWord(integer) { var prefix = ''; var suffix = ''; if (!integer){ return "zero"; } if(integer < 0){ prefix = "negative"; suffix = integerToWord(-1 * integer); return prefix + " " + suffix; } if(integer <= 90){ switch (integer) { case integer < 0: prefix = "negative"; suffix = integerToWord(-1 * integer); return prefix + " " + suffix; case 1: return "one"; case 2: return "two"; case 3: return "three"; case 4: return "four"; case 5: return "five"; case 6: return "six"; case 7: return "seven"; case 8: return "eight"; case 9: return "nine"; case 10: return "ten"; case 11: return "eleven"; case 12: return "twelve"; case 13: return "thirteen"; case 14: return "fourteen"; case 15: return "fifteen"; case 16: return "sixteen"; case 17: return "seventeen"; case 18: return "eighteen"; case 19: return "nineteen"; case 20: return "twenty"; case 30: return "thirty"; case 40: return "forty"; case 50: return "fifty"; case 60: return "sixty"; case 70: return "seventy"; case 80: return "eighty"; case 90: return "ninety"; default: break; } } if(integer < 100){ prefix = integerToWord(integer - integer % 10); suffix = integerToWord(integer % 10); return prefix + "-" + suffix; } if(integer < ONE_THOUSAND){ prefix = integerToWord(parseInt(Math.floor(integer / 100), 10) ) + " hundred"; if (integer % 100){ suffix = " and " + integerToWord(integer % 100); } return prefix + suffix; } if(integer < ONE_MILLION){ prefix = integerToWord(parseInt(Math.floor(integer / ONE_THOUSAND), 10)) + " thousand"; if (integer % ONE_THOUSAND){ suffix = integerToWord(integer % ONE_THOUSAND); } } else if(integer < ONE_BILLION){ prefix = integerToWord(parseInt(Math.floor(integer / ONE_MILLION), 10)) + " million"; if (integer % ONE_MILLION){ suffix = integerToWord(integer % ONE_MILLION); } } else if(integer < ONE_TRILLION){ prefix = integerToWord(parseInt(Math.floor(integer / ONE_BILLION), 10)) + " billion"; if (integer % ONE_BILLION){ suffix = integerToWord(integer % ONE_BILLION); } } else if(integer < ONE_QUADRILLION){ prefix = integerToWord(parseInt(Math.floor(integer / ONE_TRILLION), 10)) + " trillion"; if (integer % ONE_TRILLION){ suffix = integerToWord(integer % ONE_TRILLION); } } else if(integer < ONE_QUINTILLION){ prefix = integerToWord(parseInt(Math.floor(integer / ONE_QUADRILLION), 10)) + " quadrillion"; if (integer % ONE_QUADRILLION){ suffix = integerToWord(integer % ONE_QUADRILLION); } } else { return ''; } return prefix + " " + suffix; } function moneyToWord(value){ var decimalValue = (value % 1); var integer = value - decimalValue; decimalValue = Math.round(decimalValue * 100); var decimalText = !decimalValue? '': integerToWord(decimalValue) + ' cent' + (decimalValue === 1? '': 's'); var integerText= !integer? '': integerToWord(integer) + ' dollar' + (integer === 1? '': 's'); return ( integer && !decimalValue? integerText: integer && decimalValue? integerText + ' and ' + decimalText: !integer && decimalValue? decimalText: 'zero cents' ); } function floatToWord(value){ var decimalValue = (value % 1); var integer = value - decimalValue; decimalValue = Math.round(decimalValue * 100); var decimalText = !decimalValue? '': decimalValue < 10? "point o' " + integerToWord(decimalValue): decimalValue % 10 === 0? 'point ' + integerToWord(decimalValue / 10): 'point ' + integerToWord(decimalValue); return ( integer && !decimalValue? integerToWord(integer): integer && decimalValue? [integerToWord(integer), decimalText].join(' '): !integer && decimalValue? decimalText: integerToWord(0) ); } // test (function(){ console.log('integerToWord =================================='); for(var i = 0; i < 101; ++i){ console.log('%s=%s', i, integerToWord(i)); } console.log('floatToWord ===================================='); i = 131; while(i--){ console.log('%s=%s', i / 100, floatToWord(i / 100)); } console.log('moneyToWord ===================================='); for(i = 0; i < 131; ++i){ console.log('%s=%s', i / 100, moneyToWord(i / 100)); } }()); 

Another conversion that uses remainders and supports different languages:

 function numberToWords(number) { var result = []; var fraction = number.toFixed(2).split('.'); var integer_part = parseInt(fraction[0]); // var fractional_part = parseInt(fraction[1]); -- not handled here var previousNumber = null; for (var i = 0; i < fraction[0].length; i++) { var reminder = Math.floor(integer_part % 10); integer_part /= 10; var name = getNumberName(reminder, i, fraction[0].length, previousNumber); previousNumber = reminder; if (name) result.push(name); } result.reverse(); return result.join(' '); } 

The getNumberName function is language-dependent and handles numbers up to 9999 (but it is easy to extend it to handle larger numbers):

 function getNumberName(number, power, places, previousNumber) { var result = ""; if (power == 1) { result = handleTeensAndTys(number, previousNumber); } else if (power == 0 && places != 1 || number == 0) { // skip number that was handled in teens and zero } else { result = locale.numberNames[number.toString()] + locale.powerNames[power.toString()]; } return result; } 

handleTeensAndTys handles multiples of ten:

 function handleTeensAndTys(number, previousNumber) { var result = ""; if (number == 1) { // teens if (previousNumber in locale.specialTeenNames) { result = locale.specialTeenNames[previousNumber]; } else if (previousNumber in locale.specialTyNames) { result = locale.specialTyNames[previousNumber] + locale.teenSuffix; } else { result = locale.numberNames[previousNumber] + locale.teenSuffix; } } else if (number == 0) { // previousNumber was not handled in teens result = locale.numberNames[previousNumber.toString()]; } else { // other tys if (number in locale.specialTyNames) { result = locale.specialTyNames[number]; } else { result = locale.numberNames[number]; } result += locale.powerNames[1]; if (previousNumber != 0) { result += " " + locale.numberNames[previousNumber.toString()]; } } return result; } 

Finally, locale examples:

 var locale = { // English numberNames: {1: "one", 2: "two", 3: "three", 4: "four", 5: "five", 6: "six", 7: "seven", 8: "eight", 9: "nine" }, powerNames: {0: "", 1: "ty", 2: " hundred", 3: " thousand" }, specialTeenNames: {0: "ten", 1: "eleven", 2: "twelve" }, specialTyNames: {2: "twen", 3: "thir", 5: "fif" }, teenSuffix: "teen" }; var locale = { // Estonian numberNames: {1: "üks", 2: "kaks", 3: "kolm", 4: "neli", 5: "viis", 6: "kuus", 7: "seitse", 8: "kaheksa", 9: "üheksa"}, powerNames: {0: "", 1: "kümmend", 2: "sada", 3: " tuhat" }, specialTeenNames: {0: "kümme"}, specialTyNames: {}, teenSuffix: "teist" }; 

Here's a JSFiddle with tests: https://jsfiddle.net/rcrxna7v/15/

You can check my version from github. It is not so hard way. I test this for the numbers between 0 and 9999, but you can extend array if you would like digits to words

If you need with Cent then you may use this one

  <script> var iWords = ['zero', ' one', ' two', ' three', ' four', ' five', ' six', ' seven', ' eight', ' nine']; var ePlace = ['ten', ' eleven', ' twelve', ' thirteen', ' fourteen', ' fifteen', ' sixteen', ' seventeen', ' eighteen', ' nineteen']; var tensPlace = ['', ' ten', ' twenty', ' thirty', ' forty', ' fifty', ' sixty', ' seventy', ' eighty', ' ninety']; var inWords = []; var numReversed, inWords, actnumber, i, j; function tensComplication() { if (actnumber[i] == 0) { inWords[j] = ''; } else if (actnumber[i] == 1) { inWords[j] = ePlace[actnumber[i - 1]]; } else { inWords[j] = tensPlace[actnumber[i]]; } } function convertAmount() { var numericValue = document.getElementById('bdt').value; numericValue = parseFloat(numericValue).toFixed(2); var amount = numericValue.toString().split('.'); var taka = amount[0]; var paisa = amount[1]; document.getElementById('container').innerHTML = convert(taka) +" taka and "+ convert(paisa)+" paisa only"; } function convert(numericValue) { inWords = [] if(numericValue == "00" || numericValue =="0"){ return 'zero'; } var obStr = numericValue.toString(); numReversed = obStr.split(''); actnumber = numReversed.reverse(); if (Number(numericValue) == 0) { document.getElementById('container').innerHTML = 'BDT Zero'; return false; } var iWordsLength = numReversed.length; var finalWord = ''; j = 0; for (i = 0; i < iWordsLength; i++) { switch (i) { case 0: if (actnumber[i] == '0' || actnumber[i + 1] == '1') { inWords[j] = ''; } else { inWords[j] = iWords[actnumber[i]]; } inWords[j] = inWords[j] + ''; break; case 1: tensComplication(); break; case 2: if (actnumber[i] == '0') { inWords[j] = ''; } else if (actnumber[i - 1] !== '0' && actnumber[i - 2] !== '0') { inWords[j] = iWords[actnumber[i]] + ' hundred'; } else { inWords[j] = iWords[actnumber[i]] + ' hundred'; } break; case 3: if (actnumber[i] == '0' || actnumber[i + 1] == '1') { inWords[j] = ''; } else { inWords[j] = iWords[actnumber[i]]; } if (actnumber[i + 1] !== '0' || actnumber[i] > '0') { inWords[j] = inWords[j] + ' thousand'; } break; case 4: tensComplication(); break; case 5: if (actnumber[i] == '0' || actnumber[i + 1] == '1') { inWords[j] = ''; } else { inWords[j] = iWords[actnumber[i]]; } if (actnumber[i + 1] !== '0' || actnumber[i] > '0') { inWords[j] = inWords[j] + ' lakh'; } break; case 6: tensComplication(); break; case 7: if (actnumber[i] == '0' || actnumber[i + 1] == '1') { inWords[j] = ''; } else { inWords[j] = iWords[actnumber[i]]; } inWords[j] = inWords[j] + ' crore'; break; case 8: tensComplication(); break; default: break; } j++; } inWords.reverse(); for (i = 0; i < inWords.length; i++) { finalWord += inWords[i]; } return finalWord; } </script> <input type="text" name="bdt" id="bdt" /> <input type="button" name="sr1" value="Click Here" onClick="convertAmount()"/> <div id="container"></div> 

js fiddle

Here taka mean USD and paisa mean cent

This is also in response to naomik's excellent post ! Unfortunately I don't have the rep to post in the correct place but I leave this here in case it can help anyone.

If you need British English written form you need to make some adaptions to the code. British English differs from the American in a couple of ways. Basically you need to insert the word 'and' in two specific places.

  1. After a hundred assuming there are tens and ones. Eg One hundred and ten. One thousand and seventeen. NOT One thousand one hundred and.
  2. In certain edges, after a thousand, a million, a billion etc . when there are no smaller units. Eg One thousand and ten. One million and forty four. NOT One million and one thousand.

The first situation can be addressed by checking for 10s and 1s in the makeGroup method and appending 'and' when they exist.

 makeGroup = ([ones,tens,huns]) => { var adjective = this.num(ones) ? ' hundred and ' : this.num(tens) ? ' hundred and ' : ' hundred'; return [ this.num(huns) === 0 ? '' : this.a[huns] + adjective, this.num(ones) === 0 ? this.b[tens] : this.b[tens] && this.b[tens] + '-' || '', this.a[tens+ones] || this.a[ones] ].join(''); 

};

The second case is more complicated. It is equivalent to

  • add 'and' to 'a million, a thousand', or 'a billion' if the antepenultimate number is zero. 例如

1,100, 0 57 one million one hundred thousand and fifty seven. 5,000, 0 06 five million and six

I think this could be implemented in @naomik's code through the use of a filter function but I wasn't able to work out how. In the end I settled on hackily looping through the returned array of words and using indexOf to look for instances where the word 'hundred' was missing from the final element.

Try this code with a Turkish currency compliant JavaScript

 function dene() { var inpt = document.getElementById("tar1").value; var spt = inpt.split(''); spt.reverse(); var tek = ["", "Bir", "İki", "Üç", "Dört", "Beş", "Altı", "Yedi", "Sekiz", "Dokuz"]; var onlu = ["", "On", "Yirmi", "Otuz", "Kırk", "Elli", "Atmış", "Yetmiş", "Seksen", "Doksan"]; var Yuz = ["", "Yüz", "İkiYüz", "Üçyüz", "DörtYüz", "BeşYüz", "AltıYüz", "YediYüz", "SekizYüz", "DokuzYüz"]; var ska = ["", "", "", "", "Bin", "Milyon", "Milyar", "Trilyon", "Katrilyon", "Kentilyon"]; var i, j; var bas3 = ""; var bas6 = ""; var bas9 = ""; var bas12 = ""; var total; for(i = 0; i < 1; i++) { bas3 += Yuz[spt[i+2]] + onlu[spt[i+1]] + tek[spt[i]]; bas6 += Yuz[spt[i+5]] + onlu[spt[i+4]] + tek[spt[i+3]] + ska[4]; bas9 += Yuz[spt[i+8]] + onlu[spt[i+7]] + tek[spt[i+6]] + ska[5]; bas12 += Yuz[spt[i+11]] + onlu[spt[i+10]] + tek[spt[i+9]] + ska[6]; if(inpt.length < 4) { bas6 = ''; bas9 = ''; } if(inpt.length > 6 && inpt.slice(5, 6) == 0) { bas6 = bas6.replace(/Bin/g, ''); } if(inpt.length < 7) { bas9 = ''; } if(inpt.length > 9 && inpt.slice(1,3) == 000){ bas9 = bas9.replace(/Milyon/g, ''); } if(inpt.length < 10) { bas12 = ''; } } total = bas12 + bas9 + bas6 + bas3; total = total.replace(NaN, ''); total = total.replace(undefined, ''); document.getElementById('demo').innerHTML = total; }