Convert digits into words with JavaScript

后端 未结 27 1440
我寻月下人不归
我寻月下人不归 2020-11-22 15:08

I am making a code which converts the given amount into words, heres is what I have got after googling. But I think its a little lengthy code to achieve a simple task. Two R

27条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-11-22 15:37

    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));
      }
    }());

提交回复
热议问题