JavaScript 数字到单词

IT技术 javascript numbers
2021-01-20 14:40:01

我正在尝试将数字转换为英文单词,例如1234将变为:“一千二三十四”。

我的战术是这样的:

  • 将数字分成三个,并将它们finlOutPut从右到左放在数组 ( ) 上。

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

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

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

我做错了什么?错误在哪里?为什么它不能完美地工作?

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

<script type="text/javascript">
函数更新(){
    var bigNumArry = new Array('', '千', '百万', '十亿', '万亿', 'quadrillion', 'quintillion');

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

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

    如果(数字字符串 == 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

    for (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){
    var one = new Array('', ' one', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九');
    var tens = new Array('', '', '二十', '三十', '四十', '五十', '六十', '七十', '八十', '九十');
    var 百 = '百';
    var 输出 = '';
    var numString = num.toString();

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

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

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

    返回输出;
}   
</脚本>

</头>
<身体>

<输入类型="文本"
    身份证=“号码”
    大小=“70”
    onkeyup="更新();"
    /*这段代码防止非数字字母*/ 
    onkeydown="return (event.ctrlKey || event.altKey 
                    || (47<event.keyCode && event.keyCode<58 && event.shiftKey==false)
                    || (95<event.keyCode && event.keyCode<106)
                    || (event.keyCode==8) || (事件.keyCode==9)
                    || (event.keyCode>34 ​​&& event.keyCode<40)
                    || (event.keyCode==46))"/>
                    <br/>
<div id="container">这里是打印的数字</div>
</正文>
</html>
6个回答

当有前导零位时,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];
    }
它不起作用111,它返回One Hundred One我有一个小提琴jsfiddle.net/lhalverson/zyyb62by只是提醒一下,在我捣碎数字时发现它,哈哈
2021-03-17 14:40:01

您的问题已经解决,但我发布了另一种方法仅供参考。

代码是为了在 node.js 上测试而编写的,但在浏览器中调用时,这些函数应该可以正常工作。此外,这只处理范围 [0,1000000],但可以轻松适应更大的范围。

// actual  conversion code starts here

var ones = ['', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];
var tens = ['', '', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety'];
var teens = ['ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen'];

function convert_millions(num) {
  if (num >= 1000000) {
    return convert_millions(Math.floor(num / 1000000)) + " million " + convert_thousands(num % 1000000);
  } else {
    return convert_thousands(num);
  }
}

function convert_thousands(num) {
  if (num >= 1000) {
    return convert_hundreds(Math.floor(num / 1000)) + " thousand " + convert_hundreds(num % 1000);
  } else {
    return convert_hundreds(num);
  }
}

function convert_hundreds(num) {
  if (num > 99) {
    return ones[Math.floor(num / 100)] + " hundred " + convert_tens(num % 100);
  } else {
    return convert_tens(num);
  }
}

function convert_tens(num) {
  if (num < 10) return ones[num];
  else if (num >= 10 && num < 20) return teens[num - 10];
  else {
    return tens[Math.floor(num / 10)] + " " + ones[num % 10];
  }
}

function convert(num) {
  if (num == 0) return "zero";
  else return convert_millions(num);
}

//end of conversion code

//testing code begins here

function main() {
  var cases = [0, 1, 2, 7, 10, 11, 12, 13, 15, 19, 20, 21, 25, 29, 30, 35, 50, 55, 69, 70, 99, 100, 101, 119, 510, 900, 1000, 5001, 5019, 5555, 10000, 11000, 100000, 199001, 1000000, 1111111, 190000009];
  for (var i = 0; i < cases.length; i++) {
    console.log(cases[i] + ": " + convert(cases[i]));
  }
}

main();

我如何将 1,000,000 转换为 1M?@麦
2021-03-13 14:40:01
我认为这是更易读的答案,所以这里有一个插件版本:gist.github.com/2127650
2021-03-30 14:40:01
@PeterEhrlich 您的链接已失效!
2021-04-02 14:40:01
不应该。我只是在隐身窗口中加载它。
2021-04-02 14:40:01
非常好的解决方案,也适用于 node + amazon lambda。
2021-04-04 14:40:01

我知道这个问题已经在 3 年前解决了。特地为印度开发者发布此信息

在花了一些时间在谷歌搜索和玩其他代码之后,我做了一个快速修复和可重用的功能,适用于高达 99,99,99,999 的数字。使用:number2text(1234.56);将返回ONE THOUSAND TWO HUNDRED AND THIRTY-FOUR RUPEE AND FIFTY-SIX PAISE ONLY请享用 !

function number2text(value) {
    var fraction = Math.round(frac(value)*100);
    var f_text  = "";

    if(fraction > 0) {
        f_text = "AND "+convert_number(fraction)+" PAISE";
    }

    return convert_number(value)+" RUPEE "+f_text+" ONLY";
}

function frac(f) {
    return f % 1;
}

function convert_number(number)
{
    if ((number < 0) || (number > 999999999)) 
    { 
        return "NUMBER OUT OF RANGE!";
    }
    var Gn = Math.floor(number / 10000000);  /* Crore */ 
    number -= Gn * 10000000; 
    var kn = Math.floor(number / 100000);     /* lakhs */ 
    number -= kn * 100000; 
    var Hn = Math.floor(number / 1000);      /* thousand */ 
    number -= Hn * 1000; 
    var Dn = Math.floor(number / 100);       /* Tens (deca) */ 
    number = number % 100;               /* Ones */ 
    var tn= Math.floor(number / 10); 
    var one=Math.floor(number % 10); 
    var res = ""; 

    if (Gn>0) 
    { 
        res += (convert_number(Gn) + " CRORE"); 
    } 
    if (kn>0) 
    { 
            res += (((res=="") ? "" : " ") + 
            convert_number(kn) + " LAKH"); 
    } 
    if (Hn>0) 
    { 
        res += (((res=="") ? "" : " ") +
            convert_number(Hn) + " THOUSAND"); 
    } 

    if (Dn) 
    { 
        res += (((res=="") ? "" : " ") + 
            convert_number(Dn) + " HUNDRED"); 
    } 


    var ones = Array("", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX","SEVEN", "EIGHT", "NINE", "TEN", "ELEVEN", "TWELVE", "THIRTEEN","FOURTEEN", "FIFTEEN", "SIXTEEN", "SEVENTEEN", "EIGHTEEN","NINETEEN"); 
var tens = Array("", "", "TWENTY", "THIRTY", "FOURTY", "FIFTY", "SIXTY","SEVENTY", "EIGHTY", "NINETY"); 

    if (tn>0 || one>0) 
    { 
        if (!(res=="")) 
        { 
            res += " AND "; 
        } 
        if (tn < 2) 
        { 
            res += ones[tn * 10 + one]; 
        } 
        else 
        { 

            res += tens[tn];
            if (one>0) 
            { 
                res += ("-" + ones[one]); 
            } 
        } 
    }

    if (res=="")
    { 
        res = "zero"; 
    } 
    return res;
}
@GauravAroraa:太棒了!
2021-03-12 14:40:01
@HardikThaker - 我有机会在这里创建一个 npm 包:npmjs.com/package/number2text如果您有机会,请查看并提供您的反馈。如果您想进行任何更改,请提出请求请求
2021-03-17 14:40:01
这是题外话,问题从来都不是关于价格的。对于所有说英语的人来说,数字到单词的转换应该是一样的。
2021-03-30 14:40:01

en_UScs_CZ有 JS 库
您可以将其独立使用或作为 Node module使用。

印度版

@jasonhao 对印度货币的回答的更新版本

function intToEnglish(number) {

  var NS = [
    { value: 10000000, str: "Crore" },
    { value: 100000, str: "Lakh" },
    { value: 1000, str: "Thousand" },
    { value: 100, str: "Hundred" },
    { value: 90, str: "Ninety" },
    { value: 80, str: "Eighty" },
    { value: 70, str: "Seventy" },
    { value: 60, str: "Sixty" },
    { value: 50, str: "Fifty" },
    { value: 40, str: "Forty" },
    { value: 30, str: "Thirty" },
    { value: 20, str: "Twenty" },
    { value: 19, str: "Nineteen" },
    { value: 18, str: "Eighteen" },
    { value: 17, str: "Seventeen" },
    { value: 16, str: "Sixteen" },
    { value: 15, str: "Fifteen" },
    { value: 14, str: "Fourteen" },
    { value: 13, str: "Thirteen" },
    { value: 12, str: "Twelve" },
    { value: 11, str: "Eleven" },
    { value: 10, str: "Ten" },
    { value: 9, str: "Nine" },
    { value: 8, str: "Eight" },
    { value: 7, str: "Seven" },
    { value: 6, str: "Six" },
    { value: 5, str: "Five" },
    { value: 4, str: "Four" },
    { value: 3, str: "Three" },
    { value: 2, str: "Two" },
    { value: 1, str: "One" }
  ];

  var result = '';
  for (var n of NS) {
    if (number >= n.value) {
      if (number <= 99) {
        result += n.str;
        number -= n.value;
        if (number > 0) result += ' ';
      } else {
        var t = Math.floor(number / n.value);
        // console.log(t);
        var d = number % n.value;
        if (d > 0) {
          return intToEnglish(t) + ' ' + n.str + ' ' + intToEnglish(d);
        } else {
          return intToEnglish(t) + ' ' + n.str;
        }

      }
    }
  }
  return result;
}

console.log(intToEnglish(99))
console.log(intToEnglish(991199))
console.log(intToEnglish(123456799))